WPF如何将堆栈面板设置为资源并在TabControls中重用它

tf7tbtn2  于 2022-11-18  发布在  其他
关注(0)|答案(1)|浏览(95)

我是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不存在于当前上下文中”
我该如何解决这个问题?有没有办法设置上下文?谢谢

bksxznpy

bksxznpy1#

您可以简单地将StackPanel Package 在ContentControl中并使其成为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可以改为 Package 在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级别设置它们的值,并将它们与外部控件和窗口连接起来。这可能也很复杂和麻烦。
因此,我认为理想情况下,最好是找到一个具有类似功能的现有控件,并从现有控件派生出一个自定义控件。

相关问题