Wpf 如何为更改另一个控件宽度的控件编写样式?
是否有任何方法可以为更改另一个控件宽度的控件编写Wpf 如何为更改另一个控件宽度的控件编写样式?,wpf,xaml,Wpf,Xaml,是否有任何方法可以为更改另一个控件宽度的控件编写样式 <Style x:Key="SubMenuStyle" TargetType="Label"> <Setter Property="HorizontalContentAlignment" Value="Center"/> <Setter Property="FontFamily" Value="Arial"/> <Setter Property="FontSize" Value
样式
<Style x:Key="SubMenuStyle" TargetType="Label">
<Setter Property="HorizontalContentAlignment" Value="Center"/>
<Setter Property="FontFamily" Value="Arial"/>
<Setter Property="FontSize" Value="14"/>
<Setter Property="BorderThickness" Value="1"/>
<Setter Property="BorderBrush" Value="LightCyan"/>
<Style.Triggers>
<EventTrigger RoutedEvent="MouseLeftButtonDown">
<BeginStoryboard>
<Storyboard>
<DoubleAnimation Storyboard.TargetName="Menu" Storyboard.TargetProperty="Width" To="0" Duration="0:0:.5"/>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Style.Triggers>
</Style>
此代码导致错误:
无法在样式设置器上设置TargetName属性
我知道我可以写下面的代码,而且它是有效的:
<Label Name="Owners" Margin="0,1,0,0" MouseLeftButtonDown="SubMenuClicked" Style="{StaticResource SubMenuStyle}">
<Label.Triggers>
<EventTrigger RoutedEvent="MouseLeftButtonDown">
<BeginStoryboard>
<Storyboard>
<DoubleAnimation Storyboard.TargetName="Menu" Storyboard.TargetProperty="Width" To="0" Duration="0:0:.5"/>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Label.Triggers>
</Label>
但是因为我在多个标签中使用了这个触发器,所以我想用一种样式写一次
这是我定义控件的代码:
<Border Name="Menu" Grid.Column="2" Grid.Row="1" Width="0" HorizontalAlignment="Right" BorderBrush="LightBlue" BorderThickness="2" CornerRadius="2" Background="LightCyan">
<StackPanel Name="MenuPanel">
<Button Style="{StaticResource MenuButtonsStyle}">
<Button.Triggers>
<EventTrigger RoutedEvent="Button.Click">
<BeginStoryboard>
<Storyboard>
<DoubleAnimation Storyboard.TargetName="ListsMenu" Storyboard.TargetProperty="Height" To="86" Duration="0:0:.6"/>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Button.Triggers>
</Button>
<StackPanel Name="ListsMenu" Height="0">
<Label Name="Owners" Margin="0,1,0,0" MouseLeftButtonDown="SubMenuClicked" Style="{StaticResource SubMenuStyle}"/>
<Label Name="Contacts" MouseLeftButtonDown="SubMenuClicked" Style="{StaticResource SubMenuStyle}"/>
<Label Name="Groups" MouseLeftButtonDown="SubMenuClicked" Style="{StaticResource SubMenuStyle}"/>
</StackPanel>
</StackPanel>
</Border>
场景:有一个边框,它的默认宽度为零,在另一个触发器中它将上升到165,这很好,我想在单击标签时再次将其动画设置为零,但我无法以标签样式访问该边框的宽度尝试:
<EventTrigger RoutedEvent="MouseLeftButtonDown">
<BeginStoryboard>
<Storyboard>
<DoubleAnimation Storyboard.Target="{Binding ElementName=Menu}"
Storyboard.TargetProperty="Width" To="0" Duration="0:0:.5"/>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
TargetName仅在模板内部有效。您声称在多个标签中使用触发器,因此可以像这样定义一次触发器
<Storyboard x:Key="animation">
<DoubleAnimation Storyboard.TargetName="ListsMenu" Storyboard.TargetProperty="Height" To="86" Duration="0:0:.6"/>
</Storyboard>
<Style x:Key="style_button" TargetType="Button">
<Style.Triggers>
<EventTrigger RoutedEvent="MouseEnter">
<BeginStoryboard>
<Storyboard>
<DoubleAnimation Storyboard.TargetProperty="Width" To="300" />
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Style.Triggers>
</Style>
以后当你需要的时候,你可以打电话给它
<EventTrigger RoutedEvent="MouseEnter" >
<BeginStoryboard Storyboard="{StaticResource animation}"/>
</EventTrigger>
但我有点搞不懂你想得到什么。
您无法在样式中访问,因为正如所说的,样式并没有名称范围。若它改变了标签的宽度,你们可以这样做
<Storyboard x:Key="animation">
<DoubleAnimation Storyboard.TargetName="ListsMenu" Storyboard.TargetProperty="Height" To="86" Duration="0:0:.6"/>
</Storyboard>
<Style x:Key="style_button" TargetType="Button">
<Style.Triggers>
<EventTrigger RoutedEvent="MouseEnter">
<BeginStoryboard>
<Storyboard>
<DoubleAnimation Storyboard.TargetProperty="Width" To="300" />
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Style.Triggers>
</Style>
但它通过StoryBoard.TargetName调用另一个对象。谢谢您的回答,但它不起作用,当宽度未设置为值且为Nan,但我将宽度设置为零时,它会引发异常!PresentationCore.dll中出现“System.Windows.Media.Animation.AnimationException”类型的未处理异常。其他信息:无法使用“System.Windows.Media.Animation.DoubleAnimation”对“System.Windows.Controls.Label”上的“Width”属性设置动画。有关详细信息,请参见内部异常。--------------------------------------异常:抛出:“,System.Widow.Media.DoubleAnimation'不能使用默认值'NaN'”(System.InvalidOperationException)@SamanHakimzadehAbyaneh为什么它将您的标签称为“菜单”?我不是指标签!触发器必须将称为菜单的边框宽度更改为零,它的默认值为零,但在另一个工作正常的触发器中,它将更改为165,然后在我单击标签后,我希望它再次更改为零。在触发器的
样式中,不能使用带有TargetName
的对象,例如动画。为此,将它们放置在触发器模板中。(). 另一种选择是,您可以使用数据模板
,因为他有一个名称范围。只需将这些对象放在数据模板
中即可。使用DataTemplate
。一个DataTemplate?!还是控制模板?我看了一下链接,但它是关于一个名为river的类的,虽然我没有这样的数据类,但我只有一个边框和一些按钮和标签。但是谢谢你的回答,我会看看ControlTemplates这是一个边框,它的默认宽度是零,它会在另一个触发器中上升到165,这很好,我想在单击标签时再次将其动画设置为零,但我无法以标签样式访问该边框的宽度。然而,您当前的答案似乎很好,至少它可以防止重复代码。我尝试过,效果很好,但这是否意味着无法以一种风格完成它?或者类似的?