【发布时间】:2015-05-15 08:01:36
【问题描述】:
我在设置 UserContorl 的样式时遇到问题。我在文件中定义了名为 BusyIndicator 的 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:BusyIndicator 控件保持不变。
<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>
设置<svg:BusyIndicator Width="25" Height="25" Visibility="Hidden"> 确实有效,但如果我将<Setter Property="Visibility" Value="Hidden" /> 添加到样式中,在<Style.Triggers> 上方,则无效。
我还尝试了Opacity 和Height 等其他属性,但均未成功。
我错过了什么?
【问题讨论】:
-
设置busyindicator的可见性是否有效?尝试直接设置可见性,看看它是否有效。我遇到了一个根本没有对可见性属性做出反应的控件的问题。如果是这种情况,请设置例如高度为 0(这是一种非常肮脏的方式,我知道 -.-)
-
@Ben - 将可见性作为属性添加到
确实可以正确隐藏它。但是将其添加为样式设置器不起作用。我尝试设置高度,但这也不起作用。更新了问题以反映这一点。 -
如果由于未知原因无法更改忙碌指示器本身,如何将整个控件包装到面板(可能是停靠面板)中并使其触发可见性?