2011-11-04 3 views
2

저는 C# 프로그래밍에 익숙해서 여기에 ..이전/다음 버튼을 사용하여 XML 파일의 레코드를 순환시키는 방법은 무엇입니까?

전자 스크랩북 응용 프로그램을 선물로 쓰려고하는데 엉망이되었습니다. 내 응용 프로그램은 현재 첫 xml 레코드를 보여 주지만, 다음 버튼을 사용하여 다음 레코드로 이동하는 방법을 알고 있습니다. 나는 배열과 arraylists로 실험을 시도했지만 내가 뭘 찾고 근처에 어디서나 얻을 수없는 것. 어떤 도움이라도 대단히 감사하겠습니다 :-)

XML과 XAML 코드를 아래에 포함 시키겠다.하지만 C# 코드는 내 게시물을 너무 길게 만들므로 생략하겠습니다. 아래의 코드 중 하나가 당신에게 관련이없는 경우 사과 :

XAML :

<Grid> 
    <Grid.DataContext> 
     <XmlDataProvider Source="Data/Memories.xml" XPath="/Memories/Memory" /> 
    </Grid.DataContext> 
    <DockPanel Height="22" Name="dockPanel1" HorizontalAlignment="Stretch" VerticalAlignment="Top" Width="Auto"> 
     <Menu Height="24" Name="menu1" Width="Auto" DockPanel.Dock="Top" VerticalAlignment="Top"> 
      <MenuItem Header="_File" > 
       <MenuItem Header="Add _New Memory" Name="newMemory" Click="newMemory_Click" /> 
       <MenuItem Header="_Edit this Memory" Name="editMemory" Click="editMemory_Click" /> 
       <MenuItem Header="_Delete this Memory" Name="deleteMemory" Click="deleteMemory_Click" /> 
       <MenuItem Header="_Save Changes" Name="saveMemory" Click="saveMemory_Click" /> 
       <Separator/> 
       <MenuItem Header="E_xit" Name="exit" Click="exit_Click" /> 
      </MenuItem> 
      <MenuItem Header="_Edit" /> 
      <MenuItem Header="_Help" > 
       <MenuItem Header="_About muh program" Name="about" Click="about_Click" /> 
      </MenuItem> 
     </Menu> 
    </DockPanel> 
    <Button Content="&lt;" Margin="-70,32,0,0" Name="previousButton" Height="22" Width="20" VerticalAlignment="Top" Visibility="{Binding IsEnabled, ElementName=newMemory, Converter={StaticResource VisibleIfTrue}}" /> 
    <Button Content=">" Height="22" Margin="70,32,0,0" Name="nextButton" Width="20" VerticalAlignment="Top" Visibility="{Binding IsEnabled, ElementName=newMemory, Converter={StaticResource VisibleIfTrue}}" /> 
    <Button Content="?" Margin="0,32,0,0" Name="RandomButton" Height="22" Width="40" VerticalAlignment="Top" Visibility="{Binding IsEnabled, ElementName=newMemory, Converter={StaticResource VisibleIfTrue}}" /> 
    <TextBlock Height="30" Width="300" Margin="0,62,0,419" TextAlignment="Center" Text="{Binding [email protected]}" FontSize="15" FontWeight="Bold" Name="memoryTitle" /> 
    <TextBlock Height="30" Width="300" Margin="0,84,0,397" TextAlignment="Center" Text="{Binding XPath=./Date}" FontSize="12" FontWeight="Normal" Name="memoryDate" Panel.ZIndex="1" /> 
    <TextBlock Height="375" HorizontalAlignment="Right" Margin="0,116,26,20" Name="textOutput" Width="300" TextWrapping="Wrap" TextAlignment="Center" Background="White" Visibility="{Binding IsEnabled, ElementName=newMemory, Converter={StaticResource VisibleIfTrue}}"> 
     <TextBlock.Text> 
      <Binding XPath="./Blurb" /> 
     </TextBlock.Text> 
    </TextBlock> 
    <TextBox HorizontalAlignment="Right" Margin="0,116,26,20" Name="textInput" Height="375" Width="300" TextWrapping="Wrap" AcceptsReturn="True" Visibility="{Binding IsEnabled, ElementName=newMemory, Converter={StaticResource VisibleIfNotTrue}}" /> 
    <Image Height="375" HorizontalAlignment="Center" Margin="-326,94,0,0" Name="imgPhoto" Stretch="Uniform" VerticalAlignment="Center" Width="500" ClipToBounds="False" AllowDrop="False" Source="{Binding XPath=ImageFile}" /> 
    <Image Height="375" HorizontalAlignment="Center" Margin="-326,94,0,0" Name="imgPhotoNew" Stretch="Uniform" VerticalAlignment="Center" Width="500" ClipToBounds="False" AllowDrop="False" Visibility="{Binding IsEnabled, ElementName=newMemory, Converter={StaticResource VisibleIfNotTrue}}" /> 
    <Button Content="Done" Height="22" Width="40" Margin="463,32,375,0" Name="doneMemoryButton" VerticalAlignment="Top" Click="doneMemoryButton_Click" Visibility="{Binding IsEnabled, ElementName=newMemory, Converter={StaticResource VisibleIfNotTrue}}" /> 
    <Button Content="Select Photo" Height="22" Width="75" Margin="377,32,427,0" Name="selectPhotoButton" VerticalAlignment="Top" HorizontalAlignment="Center" Click="selectPhotoButton_Click" Visibility="{Binding IsEnabled, ElementName=newMemory, Converter={StaticResource VisibleIfNotTrue}}" /> 
</Grid> 

XML :

<Memories> 
    <Memory Title="1 Year - Howard Jones!" ID="1"> 
     <ImageFile>Data/Images/01.jpg</ImageFile> 
     <Blurb>We saw Howard Jones perform!!</Blurb> 
     <Date>06/11/2010</Date> 
    </Memory> 
    <Memory Title="Ski Holiday" ID="2"> 
     <ImageFile>Data/Images/02.jpg</ImageFile> 
     <Blurb>Our skiing holiday in Flaine!</Blurb> 
     <Date>29/11/2010</Date> 
    </Memory> 
    <Memory Title="Stinksy's Birthday: Ice Bar!" ID="3"> 
     <ImageFile>Data/Images/03.jpg</ImageFile> 
     <Blurb>Absolut Ice Bar</Blurb> 
     <Date>19/12/2010</Date> 
    </Memory> 
</Memories> 
+0

당신은 손으로 XAML을 작성하는 방법을 배워야한다 (즉, 청소기, 일반적으로 당신이 Command을 사용해야 대신 CommandParameter로 전달), 나는 그것을 읽을 수있어, 위가 디자이너로 만든 내기. –

+0

예, 도구 상자에서 끌어서 놓기 만하면됩니다. 난 배울거야! – duney

+0

예를 들어해야 할 일은 Grid의 기능을 사용하는 것입니다. 즉 RowDefinitions와 ColumnDefinitions를 추가하고 컨트롤을 Grid.Row와 Grid.Column이라는 속성을 사용하여 배치하는 것입니다. 절대 위치 지정. [the documentation] (http://msdn.microsoft.com/en-us/library/system.windows.controls.grid.aspx)의 예제를 참조하십시오. –

답변

2

내가 그 코드를 작동하지 않습니다하지만 난 당신의 간단한 예제를 제공 할 수 있습니다 이 작업을 수행하는 방법 :

<Window.Resources> 
    <XmlDataProvider x:Key="data" Source="Data/Memories.xml" XPath="/Memories/Memory" /> 
    <CollectionViewSource x:Key="dataCvs" Source="{StaticResource data}" /> 
</Window.Resources> 
<StackPanel> 
    <ContentControl Content="{Binding Source={StaticResource dataCvs}}"> 
     <ContentControl.ContentTemplate> 
      <DataTemplate> 
       <StackPanel> 
        <Image Source="{Binding XPath=ImageFile}" /> 
        <TextBlock Text="{Binding XPath=Blurb}" /> 
        <TextBlock Text="{Binding XPath=Date}" /> 
       </StackPanel> 
      </DataTemplate> 
     </ContentControl.ContentTemplate> 
    </ContentControl> 
    <Button Content="Previous" Click="Previous_Click" Tag="{StaticResource dataCvs}" /> 
    <Button Content="Next" Click="Next_Click" Tag="{StaticResource dataCvs}" /> 
</StackPanel> 

ContentControl가의 CurrentItem에 결합 추억 컬렉션 상단에보기, 나는 버튼에 CollectionViewSource 전달하므로 클릭하면 현재 항목을 변경할 수 있습니다.

private void Next_Click(object sender, RoutedEventArgs e) 
{ 
    var button = (Button)sender; 
    var cvs = (CollectionViewSource)button.Tag; 
    cvs.View.MoveCurrentToNext(); 
} 

private void Previous_Click(object sender, RoutedEventArgs e) 
{ 
    var button = (Button)sender; 
    var cvs = (CollectionViewSource)button.Tag; 
    cvs.View.MoveCurrentToPrevious(); 
} 
+0

우수함, 정확히 내가 필요로하는 것. 나는 IsCurrentBeforeFirst/IsCurrentAfterLast가 마지막 항목부터 첫 번째 항목까지 그리고 그 반대로 순환하기에 유용하다는 것을 발견했다. 많은 감사합니다. – duney

+0

@duney : 도움이 된 것을 기쁘게 생각합니다 :) –

관련 문제