none
Навиация с помощью TreeView (WPF) RRS feed

  • Вопрос

  • Заполняю дерево с помощью шаблона иерархического отображения  данных, используя XML-файл. Мне хотелось использовать дерево для решения вопроса навигации. То есть при выделении ветки должен осуществляться переход в нужное окно. Для этого в шаблоне HierarchicalDataTemplate создаю TextBlock с именем "MyWnd" в которое будет подгружаться из XML-файла нужная для перехода информация (например, путь/имя_файла_окна):

    <HierarchicalDataTemplate> 
    ... 
    <WrapPanel> 
      <TextBlock Text="{Binding Path=...}" > 
      <TextBlock x:Name"MyWnd" Text="{Binding Path=...}" Visibility="Hidden" /> 
    </WrapPanel> 
    </HierarchicalDataTemplate>

     

    private void tree_Selected(object sender, RoutedEventArgs e) 
    { 
       TreeViewItem tvi = (TreeViewItem)e.OriginalSource; 
       //??? 
    }

    Как здесь прочитать значение, записанное в TextBlock x:Name"MyWnd"?

    Как вообще решить эту проблему?

    Есть обработчик события Selected:
    • Перемещено Tagore Bandlamudi 2 октября 2010 г. 21:06 MSDN Forums consolidation (От:Разработка Windows-приложений)

Ответы

  • Почему-то в головк приходит только такой вот не разметочный вариант:

        <TreeView ItemTemplate="{StaticResource ResourceKey=xxx}" Name="myTreeView" 
        Margin="0,0,356,0" SelectedItemChanged="myTreeView_SelectedItemChanged">
    

    И соответственно

        private void myTreeView_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
        {
          Console.WriteLine(((XElement)this.myTreeView.SelectedItem).Attribute("Description").Value.ToString());
        }
    

    • Помечено в качестве ответа I.Vorontsov 12 июля 2010 г. 12:37
    12 июля 2010 г. 10:57
    Модератор

Все ответы

  • Насколько я понял нужно примерно следующее:

    <Grid.Resources>
          <XmlDataProvider x:Key="myNavigationData" XPath="/NavigationData">
            <x:XData>
              <NavigationData xmlns="">
                <NavigationInfo>
                  <NavigationFormName>Открыть форму 1</NavigationFormName>
                  <FormParmetr>Пустую</FormParmetr>
                  <FormName>Form1</FormName>
                </NavigationInfo>
                <NavigationInfo>
                  <NavigationFormName>Открыть форму 2</NavigationFormName>
                  <FormName>Form2</FormName>
                </NavigationInfo>
              </NavigationData>
            </x:XData>
          </XmlDataProvider>
    
          <HierarchicalDataTemplate DataType="NavigationInfo">
            <TextBlock Text="{Binding XPath=NavigationFormName}" />
          </HierarchicalDataTemplate>
        </Grid.Resources>
    
    
        <TreeView ItemsSource="{Binding Source={StaticResource myNavigationData}, 
        XPath=NavigationInfo}" 
        Name="myTreeView" 
        SelectedValuePath="FormName" Margin="0,0,356,0" SelectedItemChanged="myTreeView_SelectedItemChanged" />
    
    И собственно в обработчике можно использовать SelectedValue

        private void myTreeView_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
        {
          Console.WriteLine(this.myTreeView.SelectedValue.ToString());
        }
    

    Которое будет содержать FormName.

     

    Модератор
  • Ваш пример хорош, но мне надо по-другому! Заполнение дерева их файла XML.

    Пример файла:

    <?xml version="1.0" encoding="utf-8" ?>
    <MyXmlDocument>
    <Category CategoryName="..." Description ="..." >
    <Category CategoryName="..." Description ="...">
    <Category CategoryName="..." Description ="..."/>
    <Category CategoryName="..." Description ="...">
    <Category Category="" CategoryName="..." Description ="..."/>
    </Category>
    <Category Category="" CategoryName="..." Description ="..."/>
    </Category>
    <Category Category="" CategoryName="..." Description ="...">
    <Category Category="" CategoryName="..." Description ="..."/>
    <Category Category="" CategoryName="..." Description ="..."/>
    </Category>
    </Category>
    </MyXmlDocument>

     

     

     

    Шаблон:

    <HierarchicalDataTemplate x:Key="xxx" DataType="{x:Type linq2Xml:XElement}">
    <HierarchicalDataTemplate.ItemsSource>
    ...
    </HierarchicalDataTemplate.ItemsSource>
    <WrapPanel>
    <TextBlock Text="{Binding Path=Attribute[CategoryName].Value}"/>
    <TextBlock x:Name="ttt" Text="{Binding Path=Attribute[Description].Value}" Visibility="Hidden"</TextBlock>
    </WrapPanel>
    </HierarchicalDataTemplate>

     

     

    В окне:

    <

     

    TreeView Name="treeStructure" ItemTemplate="{StaticResource ResourceKey=xxx}" SelectedValuePath="Description" TreeViewItem.Selected="treeStructure_Selected" / >

     

     

    А при обработке события Selected - null.

     

     

     

    Подскажите, пожалуйста, как мне эту проблему решить? Явно где-то ошибся.

     

    private void treeStructure_Selected(object sender, RoutedEventArgs e)
    { string my = this.treeStructure.SelectedValue.ToString(); // = null }
    

     

     

    • Изменено yura_ 9 июля 2010 г. 13:42
    9 июля 2010 г. 13:10
  • Несколько раз переписывал (редактировал) предыдущее сообщение, но победить размер шрифта так и не смог! Ничего не видно.

    9 июля 2010 г. 13:27
  • XML Документ действительно такой или это тоже проблемы форматирования? 
    9 июля 2010 г. 18:31
    Модератор
  • Да. Файл примерно такой:

    <?xml version="1.0" encoding="utf-8" ?>

    <MyXmlDocument>

      <Category CategoryName="Компьютерная литература" Description ="Различная литература по компьютерной тематике" ToolTipText="Мой раздел">

        <Category CategoryName="Windows-приложения" Description ="Данная ОС наиболее популярна" ToolTipText="Моя ось">

          <Category CategoryName="MS Office 2007" Description ="Офисный пакет программ" ToolTipText="Мой офис"/>

          <Category CategoryName="Продукция компании Autodesk" Description ="Различные САПР" ToolTipText="Мой выбор">

            <Category CategoryName="AutoCAD" Description ="Самый распространённый САПР" ToolTipText="Мой САПР">

              <Book BookName ="AutoCAD 2010. Полещук Н.Н." Description ="Моя книжка по данному САПР" ToolTipText="Справочник"/>

              <Book BookName ="AutoCAD 2007, библия пользователя. (автора не помню)" Description ="Ещё одна моя книжка по данному САПР" ToolTipText="Справочник"/>

            </Category>

            <Category CategoryName="Revit" Description ="новое поколение САПР (BIM)" ToolTipText="Пока ещё не мой САПР"/>

          </Category>

        </Category>

        <Category CategoryName="Linux-приложения" Description ="Свободно распространяемая ОС" ToolTipText="Интересно, но не сильно распространено"/>

      </Category>

      <Category CategoryName="Классика" Description ="Классическая литература" ToolTipText="Полезно для общего развития">

        <Category CategoryName="Поэзия" Description ="Стихи отечественных авторов" ToolTipText="Для души"/>

        <Category CategoryName="Повести и рассказы" Description ="Повести и рассказы отечественных авторов" ToolTipText="Это тоже для души"/>

      </Category>

    </MyXmlDocument>

     С учетом того, что  Description="Window1.xaml", и т.п. по разным веткам.  

    10 июля 2010 г. 8:27
  • Почему-то в головк приходит только такой вот не разметочный вариант:

        <TreeView ItemTemplate="{StaticResource ResourceKey=xxx}" Name="myTreeView" 
        Margin="0,0,356,0" SelectedItemChanged="myTreeView_SelectedItemChanged">
    

    И соответственно

        private void myTreeView_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
        {
          Console.WriteLine(((XElement)this.myTreeView.SelectedItem).Attribute("Description").Value.ToString());
        }
    

    • Помечено в качестве ответа I.Vorontsov 12 июля 2010 г. 12:37
    12 июля 2010 г. 10:57
    Модератор
  • Спасибо. То что надо! Может подскажите хорошую книжку по WPF?

    12 июля 2010 г. 12:24
  • Мэтью Мак-Дональд "WPF в .NET 3.5 с примерами на C# 2008..." (Matthew
    MacDonald "WPF in C# 2008...")
     
    12 июля 2010 г. 12:34
    Модератор
  • как открыть не клиентскую область окна     (разобрать окно на части в windows)

    может видео подскажите?

    1 сентября 2010 г. 10:14