在click事件上更改窗口的一部分

时间:2013-12-03 07:58:03

标签: c# wpf

我在屏幕的左侧有一个树视图,当我点击任何TreeViewItem时,我希望屏幕的右侧相应地改变。

例如,单击“项目”将显示在屏幕的右半部分,项目名称的标签以及文本框中的项目名称,以及其他一些字段的类似标签 - 文本框对。单击“项目”的子选项(例如“任务1”)应更改屏幕的右半部分,以便代替项目名称和详细信息的标签和文本框,现在应该是任务名称/详细信息。 Atm,我只关心标签文本框对,但将来我需要一些更复杂的选项,可能是按钮和表格。

我想到的是为每个选项预制一个网格,当我点击“项目”时,会有一个显示项目所有信息的网格。然后,当我单击“任务1”时,应隐藏项目网格,并显示任务网格,并填写字段。

这可能吗?我应该使用什么来创建我可以选择的模板?

2 个答案:

答案 0 :(得分:0)

Firoz已经提到了重要的一点。粗略猜测是您没有使用MVVM模式,因此为了最大限度地减少调整工作量,您可以在窗口中添加Content Control,并在进行选择时设置此控件的内容。您可以在其中放置任何用户控件。

使用 MVVM 意味着您将Content Control绑定到ViewModelUIElementUserControl类型)的属性并设置每当绑定的选定值更改时实例。说到选定的值,我认为默认的TreeView并不是真正的绑定友好的,所以你最终可能会遇到为你做绑定的行为。

答案 1 :(得分:0)

你要做的事情很简单,也很可能,但我认为你的想法不够大。

随着项目的增长以及您想要展示的不同内容的数量的增加,您将需要显示和隐藏越来越多的控件。这很快就会变得无法管理。相反,考虑一些其他控件处理这个问题,在某些方面你做的事情就像一个标签式对话框,只是一组分层标签。

选项卡式对话框有一个面板和一组选项卡,当您单击每个选项卡时,面板的内容会发生变化。实际上,您可以为要显示的每个专用UI集创建UserControl个,例如:您可以使用ProjectControl显示所有项目文本框,标签,按钮等。

此外,WPF还有一个名为DataTemplate的简洁功能,它们定义了数据类型在显示时的外观。所以,如果你有一个

public class MyProject
{
  public string Name {get;set;}
}

然后你可以定义

<DataTemplate DataType="{x:Type MyProject}>
  <TextBox Text="{Binding Name}"/>
</DataTemplate>

如果您将数据设置为标签面板的内容,WPF会自动将数据转换为可视形式。

然而,面板中的这种类型的显示内容并不是唯一执行此操作的WPF控件。还有一种称为NavigationFrame的东西,它也可以用作NavigationWindow包裹在窗口中。此控件提供了导航到要显示的下一个Page的方法。 Page可以像选项卡式对话框中的UserControl一样,但也可以是URI,如果您愿意,可以从网络链接内容。此外,您可以从其他控件调用NavigateTo,从而构建更多可用的界面。

我在

中完成了构建完整Windows控制面板样式界面的过程

我之后添加了VS2012风格的发光

然后在

中将整个源代码作为开源发布

WinChrome example

这支持使用

嵌入导航面板
<WinChrome:SearchableNavigationWindow 
  x:Class="WinChrome.Win7Demo.MainWindow"
...
  xmlns:WinChrome="clr-namespace:WinChrome;assembly=WinChrome" 
  Style="{StaticResource Win7NavigationWindow}">

<WinChrome:SearchableNavigationWindow.Navigation>
    <view:Navigation x:Name="navigationTree"/>
</WinChrome:SearchableNavigationWindow.Navigation>    

(Full source code)

导航窗口嵌入的位置,但也可以是TreeView。

<UserControl x:Class="WinChrome.View.Navigation"  ...>
  <ScrollViewer HorizontalScrollBarVisibility="Disabled" Padding="12,0" 
      VerticalScrollBarVisibility="Auto" >
    <StackPanel>
      <Button 
        Margin="0,12,0,0" Style="{StaticResource LinkNavigatorButtonStyle}" 
        Content="Home" 
       Command="{Binding 
       RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Win7Demo:MainWindow}, AncestorLevel=1}, 
       Path=GoHomeCommand}" />                   
    </StackPanel>
</ScrollViewer>

(Full source code)