【问题标题】:WPF Changing the style of a UserControl in a ListViewWPF 在 ListView 中更改 UserControl 的样式
【发布时间】:2015-05-15 08:01:36
【问题描述】:

我在设置 UserContorl 的样式时遇到问题。我在文件中定义了名为 BusyIndi​​cator 的 UserControl。下面是xml。

<UserControl x:Class="Foo.Client.UI.SVGs.BusyIndicator"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             mc:Ignorable="d" 
             d:DesignHeight="300" d:DesignWidth="300"
             DataContext="{Binding RelativeSource={RelativeSource Self}}"
             >
    <UserControl.Template>
        <ControlTemplate>
            <Border Width="{Binding Width}" Height="{Binding Height}" Visibility="{TemplateBinding Control.Visibility}">
                <Canvas Width="{Binding Width}" Height="{Binding Height}"  Visibility="{TemplateBinding  Control.Visibility}">
                    <Path Fill="{Binding Foreground}"
                          Height="25"
                          Width="25"
                          Data="M20.519,4.617c-3.262-3.111-7.821-3.965-12.03-2.236 c-4.282,1.76-6.895,5.654-6.863,10.227l3.658-0.025C5.263,9.51,7.017,6.892,9.894,5.71c2.81-1.154,5.85-0.598,8.037,1.456 l-1.395,1.376h5.39V3.227L20.519,4.617z"/>
                </Canvas>
            </Border>
        </ControlTemplate>
    </UserControl.Template>
</UserControl>

然后我引用 UserControl 并在 ListView 中使用它。 ListView 绑定的对象有一个名为 Status 的属性。当状态设置为“正在运行”时,我想更改样式。当我运行它时,Button 是隐藏的,所以我知道 Status 属性正在正确通知。但 svg:BusyIndi​​cator 控件保持不变。

<UserControl x:Class="Foo.Views.Screens.CollectionResultsView"
                 AutomationProperties.AutomationId="CollectionResultsView"
                 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"  
                 mc:Ignorable="d"
                 xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
                 xmlns:svg="clr-namespace:Foo.Client.UI.SVGs;assembly=Foo.Client.UI" 
                 d:DesignWidth="700">
    <ListView ItemsSource="{Binding TargetStatusView}">
        <StackPanel>
            <Button>
                <TextBlock Text="X"></TextBlock>
                <Button.Style>
                    <Style TargetType="Button">
                        <Setter Property="Visibility" Value="Visible" />
                        <Style.Triggers>
                            <DataTrigger Binding="{Binding Status}" Value="Running">
                                <Setter Property="Visibility"  Value="Hidden" />
                            </DataTrigger>
                        </Style.Triggers>
                    </Style>
                </Button.Style>
            </Button>
            <svg:BusyIndicator Width="25" Height="25">
                <svg:BusyIndicator.Style>
                    <Style TargetType="svg:BusyIndicator">
                        <Setter Property="Visibility" Value="Visible" />
                        <Style.Triggers>
                            <DataTrigger Binding="{Binding Status}" Value="Running">
                                <Setter Property="Visibility" Value="Hidden"/>
                            </DataTrigger>
                        </Style.Triggers>
                    </Style>
                </UserControl.Style>
            </svg:BusyIndicator>
        </StackPanel>
    </ListView>
</UserControl>

我也尝试将 TargetType 更改为 UserControl,但也没有用。

<svg:BusyIndicator Width="25" Height="25">
    <UserControl.Style>
        <Style TargetType="UserControl">
            <Setter Property="Visibility" Value="Visible" />
            <Style.Triggers>
                <DataTrigger Binding="{Binding Status}" Value="Running">
                    <Setter Property="Visibility" Value="Hidden"/>
                    <Setter Property="Foreground" Value="White" />
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </UserControl.Style>
</svg:BusyIndicator>

设置&lt;svg:BusyIndicator Width="25" Height="25" Visibility="Hidden"&gt; 确实有效,但如果我将&lt;Setter Property="Visibility" Value="Hidden" /&gt; 添加到样式中,在&lt;Style.Triggers&gt; 上方,则无效。

我还尝试了Opacity 和Height 等其他属性,但均未成功。

我错过了什么?

【问题讨论】:

  • 设置busyindicator的可见性是否有效?尝试直接设置可见性,看看它是否有效。我遇到了一个根本没有对可见性属性做出反应的控件的问题。如果是这种情况,请设置例如高度为 0(这是一种非常肮脏的方式,我知道 -.-)
  • @Ben - 将可见性作为属性添加到 确实可以正确隐藏它。但是将其添加为样式设置器不起作用。我尝试设置高度,但这也不起作用。更新了问题以反映这一点。
  • 如果由于未知原因无法更改忙碌指示器本身,如何将整个控件包装到面板(可能是停靠面板)中并使其触发可见性?

标签: wpf xaml


【解决方案1】:

问题在于我们定义 BusyIndi​​cator 控件的方式。因为DataContext 被设置为{Binding RelativeSource={RelativeSource Self}}。这样,当它在 ListView 中使用时,上下文是控件本身,而不是绑定到 ListView 的数据。所以Binding="{Binding Status}" 确实有效,因为 BusyIndi​​cator 用户控件没有 Status 属性。

我们更新了下面的控件并且它起作用了。

<UserControl x:Class="Foo.Client.UI.SVGs.BusyIndicator"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             mc:Ignorable="d" 
             d:DesignHeight="300" d:DesignWidth="300">
    <Canvas>
                <Path Fill="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}, Path=Foreground}" 
                          Data="M20.519,4.617c-3.262-3.111-7.821-3.965-12.03-2.236 c-4.282,1.76-6.895,5.654-6.863,10.227l3.658-0.025C5.263,9.51,7.017,6.892,9.894,5.71c2.81-1.154,5.85-0.598,8.037,1.456 l-1.395,1.376h5.39V3.227L20.519,4.617z">
                </Path>
                <Path Fill="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}, Path=Foreground}" Data="M4.733,20.634c3.26,3.111,7.82,3.964,12.03,2.234c4.281-1.76,6.894-5.652,6.862-10.227l-3.658,0.025c0.021,3.073-1.733,5.69-4.61,6.872c-2.808,1.155-5.85,0.598-8.037-1.457l1.396-1.375H3.324v5.315L4.733,20.634z" >
                </Path>
    </Canvas>       
</UserControl>

【讨论】:

    猜你喜欢
    • 2016-11-29
    • 1970-01-01
    • 2018-05-09
    • 1970-01-01
    • 2013-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多