应用样式和可见性.对隐藏控件可见不起作用
本文关键字:控件 不起作用 隐藏 样式 可见性 应用 | 更新日期: 2023-09-27 18:08:21
我有一个在XAML中定义的标签控件和样式:
<Style x:Key="EditModeEditedHiddenTemplate" TargetType="Control">
<Setter Property="Background" Value="DarkOrange" />
<Setter Property="Visibility" Value="Visible" />
</Style>
…其他东西…
<Label Grid.Column="0" Grid.Row="1" Name="SomeName" Visibility="Hidden">Some content</Label>
然后,在基于用户输入的代码中,我将样式应用到控件中,如下所示:
var editModelControlStyle = new Style(control.GetType());
foreach (var setter in editModeStyleTemplate.Setters)
{
editModelControlStyle.Setters.Add(setter);
}
editModelControlStyle.BasedOn = control.Style;
control.Style = editModelControlStyle;
对于大多数依赖属性,这工作得很好,比如Background。然而,当涉及到可见性时,这不起作用,控件仍然是不可见的。
你能帮我理解为什么会这样以及如何解决吗?
如果你像这样设置了Visibility
属性:
<Label Name="SomeName" Visibility="Hidden" Content="Something" />
…那么这将意味着这个指定的值将覆盖在应用的Style
中设置的任何值。
<Style x:Key="EditModeEditedHiddenTemplate" TargetType="Control">
<Setter Property="Background" Value="DarkOrange" />
<Setter Property="Visibility" Value="Visible" /><!-- No effect-->
</Style>
DependencyProperty
s可以从许多不同的源设置,例如Style
s, Animation
s和inline,仅举几个例子,因此,它们具有特定的优先顺序,指定哪个源应该覆盖其他源。你可以在MSDN的依赖属性值优先级页面的依赖属性设置优先级列表部分找到更多信息。
从该列表中,您可以看到只有Animation
s和Property系统强制可以覆盖内联属性值。因此,如果不能从XAML中删除Visibility="Hidden"
,则只能在动画中或通过属性强制转换将Visibility
属性设置为Visible
。但是,这两种方法都需要对XAML进行更改才能正常工作。这是如何在Animation
:
Visibility
值的方法。<Label Name="SomeName" Visibility="Hidden" Content="Something">
<Label.Triggers>
<EventTrigger RoutedEvent="Loaded">
<BeginStoryboard>
<Storyboard BeginTime="0:0:1">
<ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Visibility">
<DiscreteObjectKeyFrame Value="{x:Static Visibility.Visible}" />
</ObjectAnimationUsingKeyFrames>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Label.Triggers>
</Label>
我将Storyboard.BeginTime
设置为1秒,以便您可以看到文本出现,但同样,这可以设置为0秒,以便在加载后立即发生。属性强制要求您将一个属性绑定到Visibility
属性:
<Label Name="SomeName" Visibility="{Binding SomeProperty}" Content="Something" />
但是,如果您不能在Label
上更改XAML,那么您就没有办法单独在XAML中使Visibility
的值Visible
。如果可以在代码中做到这一点…你只需要一些触发变化的条件。在本例中,我刚刚向Grid
添加了一个单击处理程序,以访问后面的代码:
<Grid PreviewMouseDown="OnPreviewMouseDown" Background="Transparent">
<Label Name="SomeName" Visibility="Hidden" Content="Something" />
</Grid>
…
private void OnPreviewMouseDown(object sender, MouseButtonEventArgs e)
{
SomeName.Visibility = Visibility.Visible;
}
但是,您仍然需要更改XAML来完成此操作。也许你可以在代码中附加一个处理程序?