如何在用户控件WPF中使用树视图导航到不同页面

时间:2019-07-08 07:31:50

标签: c# wpf

在主窗口中,我有一个Frame,它有一个登陆页面的源,在框架的顶部是一个用户控件,其中包含一个TreeView,{{1 }}导航到另一个页面。

当我单击每个节点时,我想更改TreeView的来源。

如何基于Frame节点将Source的{​​{1}}更改为相应的Frame

这是我到目前为止尝试过的:

但是,仅当我将Page放在每个TreeView上时,此方法才有效;如果我将其放在主窗口的UserControl上,则不起作用。当我尝试所需的方法时,我收到一条消息,提示“值未设置为对象的实例”

这是用户控件的XAML:

Page

这是用户控件的CS:

Frame

这是我的MainWindow的xaml:

<TreeView>
  <TreeViewItem Header="applications"
                Margin="0,10,0,0">
    <TreeViewItem Name="newApplication"
                  Header="new applications"
                  MouseDoubleClick="NewApplication_MouseDoubleClick"></TreeViewItem>
    <TreeViewItem Name="approvedApplication"
                  Header="approved applications"
                  MouseDoubleClick="ApprovedApplication_MouseDoubleClick"></TreeViewItem>
  </TreeViewItem>
  <TreeViewItem Header="repair requests">
    <TreeViewItem Header="tester"></TreeViewItem>
  </TreeViewItem>
</TreeView>

我想将用户控件放在private void NewApplication_MouseDoubleClick(object sender, MouseButtonEventArgs e) { Uri uri = new Uri("/Views/oem_newApplications.xaml", UriKind.Relative); NavigationService ns = NavigationService.GetNavigationService(this); ns.Navigate(uri); } 上,并使用<Grid> <Frame x:Name="mainFrame" Source="/Views/oem_main.xaml"/> <local:menuTree HorizontalAlignment="Left" Height="584" Margin="0,135,0,0" VerticalAlignment="Top" Width="160"/> </Grid> 来更改Frame

1 个答案:

答案 0 :(得分:0)

您可以将TreeView.SelectedItem直接绑定到Frame.Source。此解决方案使用FrameworkElement.Tag属性存储Page URI。要使绑定生效,您需要将TreeView.SelectedItem的{​​{1}}强制转换为object

或者,您可以引入一个附加属性来保存TreeViewItem URI。

如果PageTreeView的一部分并且不能直接访问,则应通过专用属性(例如UserControl)公开TreeView.SelectedItem,然后绑定{ {1}}:

MenuTree.xaml.cs

SelectedPage

MenuTree.xaml

Frame.Source

MainWindow.xaml

public partial class MenuTree : UserControl
{
  public static readonly DependencyProperty SelectedPageProperty = DependencyProperty.Register(
    "SelectedPage",
    typeof(string),
    typeof(MenuTree),
    new PropertyMetadata("/landingPage.xaml"));

  public string SelectedPage
  {
    get { return (string) GetValue(MenuTree.SelectedPageProperty); }
    set { SetValue(MenuTree.SelectedPageProperty, value); }
  }

  public MenuTree()
  {
    InitializeComponent();
  }

  private void OnSelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
  {
    this.SelectedPage = (e.NewValue as FrameworkElement)?.Tag as string;
  }
}

ExamplePage.xaml

<UserControl>
  <TreeView x:Name="IndexTreeView" SelectedItemChanged="OnSelectedItemChanged" >
    <TreeViewItem Header="applications">
      <TreeViewItem Header="approved applications"
                    Tag="/ExamplePage.xaml" />
    </TreeViewItem>
  </TreeView>
</UserControl>