我是c#和WPF的新手,所以请给我一些建议:
我有一个WPF应用程序用来显示一些堆栈面板,所有堆栈面板的默认可见性设置为折叠,它们将根据接收到的数据切换到可见。
现在我想把所有这些堆栈面板都变成资源,这样我就可以在一些新添加的选项卡控件和堆栈面板中重用它们。
<StackPanel x:Name="ColorOption" Visibility="Collapsed">
<TextBlock Text="Line Color" Style="{StaticResource ItemNameTextBlockStyle}"/>
<Button Style="{StaticResource ColorButtonStyle}" Click="Color_Click">
<Button.Content>
<Rectangle x:Name="LineColorRect" Style="{StaticResource ColorSelectionRectangleStyle}" />
</Button.Content>
</Button>
</StackPanel>
上面是我使用的堆叠面板的一个例子。在函数"Color_Click"后面的代码中将改变这个"ColorOption"栈面板状态并做点什么
然而,在我试图把这个堆栈面板到Windows。资源
<Window.Resources>
<StackPanel x:Name="ColorOption" Visibility="Collapsed" x:Key="ColorOption">
<TextBlock Text="Line Color" Style="{StaticResource ItemNameTextBlockStyle}"/>
<Button Style="{StaticResource ColorButtonStyle}" Click="Color_Click">
<Button.Content>
<Rectangle x:Name="LineColorRect" Style="{StaticResource ColorSelectionRectangleStyle}" />
</Button.Content>
</Button>
</StackPanel>
</Window.Resources> (I also put the style files inside)
在选项卡控件中,我做了
<TabControl>
<TabItem Header="Tab 1" Content="{StaticResource ColorOption}"/>
</TabControl>
visual studio显示错误代码后面说&;ColorOption在当前上下文中不存在&;
我该如何解决这个问题?有办法设置上下文吗?谢谢你
你可以简单地在ContentControl
中包装StackPanel并使其成为ControlTemplate。
<ControlTemplate x:Key="ColorOptionTemplate" TargetType="{x:Type ContentControl}">
<StackPanel x:Name="ColorOption" Visibility="Collapsed">
<TextBlock Text="Line Color" Style="{StaticResource ItemNameTextBlockStyle}"/>
<Button Style="{StaticResource ColorButtonStyle}" Click="Color_Click">
<Button.Content>
<Rectangle x:Name="LineColorRect" Style="{StaticResource ColorSelectionRectangleStyle}"/>
</Button.Content>
</Button>
</StackPanel>
</ControlTemplate>
但是,您需要更改ContentControl
内部控件的属性,这将是麻烦的。所以StackPanel可以用UserControl
来代替。
<UserControl x:Class="WpfApp1.ColorOptionControl"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<StackPanel x:Name="ColorOption" Visibility="Collapsed">
<TextBlock Text="Line Color" Style="{StaticResource ItemNameTextBlockStyle}"/>
<Button Style="{StaticResource ColorButtonStyle}" Click="Color_Click">
<Button.Content>
<Rectangle x:Name="LineColorRect" Style="{StaticResource ColorSelectionRectangleStyle}"/>
</Button.Content>
</Button>
</StackPanel>
</UserControl>
这是WPF中常见的方式。缺点是您需要将依赖属性添加到UserControl
,并将它们与内部控件的依赖属性连接起来,以便您可以在UserControl
级别设置它们的值,并将它们与外部控件和窗口连接起来。这也可能是复杂和繁琐的。
所以我认为理想情况下最好找到一个现有的控件,它有你想要的类似功能,并创建一个自定义控件派生自现有的。