Wpf 如何改变祖先';从样式中删除属性
我有一个按钮的样式,当我的按钮单击事件从样式中激发而没有任何代码时,我想将窗口的WindowsState属性更改为最大化。 我试过这个,但不起作用。 这个错误出现了: “无法解析属性路径“WindowsState”中的所有属性引用。请验证适用对象是否支持这些属性。” 请问你对工作有什么想法吗Wpf 如何改变祖先';从样式中删除属性,wpf,Wpf,我有一个按钮的样式,当我的按钮单击事件从样式中激发而没有任何代码时,我想将窗口的WindowsState属性更改为最大化。 我试过这个,但不起作用。 这个错误出现了: “无法解析属性路径“WindowsState”中的所有属性引用。请验证适用对象是否支持这些属性。” 请问你对工作有什么想法吗 <Window x:Class="MyTestApp.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/p
<Window x:Class="MyTestApp.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:MyTestApp"
mc:Ignorable="d"
x:Name="ss"
Title="MainWindow" Height="350" Width="525">
<Window.Resources>
<Style TargetType="Button">
<Style.Triggers>
<EventTrigger RoutedEvent="Button.Click">
<BeginStoryboard>
<Storyboard >
<ObjectAnimationUsingKeyFrames
Storyboard.Target="{Binding RelativeSource={RelativeSource AncestorType=Window ,Mode=FindAncestor }}"
Storyboard.TargetProperty="WindowState"
>
<DiscreteObjectKeyFrame KeyTime="0:0:0">
<DiscreteObjectKeyFrame.Value>
<WindowState>Maximized</WindowState>
</DiscreteObjectKeyFrame.Value>
</DiscreteObjectKeyFrame>
</ObjectAnimationUsingKeyFrames>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Style.Triggers>
</Style>
</Window.Resources>
<Grid>
<StackPanel Width="200" Height="200" Background="Aqua">
<Button Content="Click me !" Width="100" Height="50"/>
</StackPanel>
</Grid>
</Window>
最大化
更新1:
我有一个新问题。我创建了两个按钮,一个用于最大化状态,一个用于正常状态。如果我只使用这两个按钮,就没有问题。我试图通过窗口的最大化按钮来最大化我的窗口,但我的样式正常的按钮不起作用!!如果我通过单击窗口的最大化按钮来最大化窗口,则我的样式化普通按钮不起作用。因此,如果我单击样式化最大化按钮,则样式化普通按钮再次起作用。怎么了
<Window x:Class="MyTestApp.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:MyTestApp"
StateChanged="ss_StateChanged"
mc:Ignorable="d"
x:Name="ss"
Title="MainWindow" Height="350" Width="525">
<Window.Resources>
<Style TargetType="Button" x:Key="MaximizedButtonStyle">
<Setter Property="Tag" Value="{Binding RelativeSource={RelativeSource AncestorType=Window}}"/>
<Style.Triggers>
<EventTrigger RoutedEvent="Button.Click">
<BeginStoryboard>
<Storyboard >
<ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Tag.WindowState" >
<DiscreteObjectKeyFrame KeyTime="0:0:0">
<DiscreteObjectKeyFrame.Value>
<WindowState>Maximized</WindowState>
</DiscreteObjectKeyFrame.Value>
</DiscreteObjectKeyFrame>
</ObjectAnimationUsingKeyFrames>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Style.Triggers>
</Style>
<Style TargetType="Button" x:Key="NormalButtonStyle">
<Setter Property="Tag" Value="{Binding RelativeSource={RelativeSource AncestorType=Window}}"/>
<Style.Triggers>
<EventTrigger RoutedEvent="Button.Click">
<BeginStoryboard>
<Storyboard >
<ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Tag.WindowState" >
<DiscreteObjectKeyFrame KeyTime="0:0:0">
<DiscreteObjectKeyFrame.Value>
<WindowState>Normal</WindowState>
</DiscreteObjectKeyFrame.Value>
</DiscreteObjectKeyFrame>
</ObjectAnimationUsingKeyFrames>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Style.Triggers>
</Style>
</Window.Resources>
<Grid>
<StackPanel Width="200" Height="200" Background="Aqua">
<Button x:Name="b1" Style="{StaticResource NormalButtonStyle}" Content="Normal Click me !" Width="100" Height="50" />
<Button x:Name="b2" Style="{StaticResource MaximizedButtonStyle}" Content="maximize eClick me !" Width="100" Height="50" />
</StackPanel>
</Grid>
</Window>
最大化
典型的
如果查看Visual Studio中的输出窗格,您将看到RelativeSource正在失败。我认为它可能会失败,因为故事板不在视觉树中。绑定最终在按钮本身上查找WindowsState
这里有一个对我来说有点难看的解决方案:在故事板中,所有绑定可以“看到”的是按钮,而不是视觉树的其余部分。因此,我们将把窗口偷偷带到按钮的属性中。一个更体面的方法是使用一个。绑定代理是一种有用的技术,值得了解
<Style TargetType="Button" x:Key="MinimizeButtonStyle">
<Setter
Property="Tag"
Value="{Binding RelativeSource={RelativeSource AncestorType=Window}}"
/>
<Style.Triggers>
<EventTrigger RoutedEvent="Button.Click">
<BeginStoryboard>
<Storyboard >
<ObjectAnimationUsingKeyFrames
Storyboard.TargetProperty="Tag.WindowState"
>
<!-- the rest is the same as what you've got -->
以下是我在原始代码的输出中看到的错误:
System.Windows.Data错误:4:找不到引用为“RelativeSource FindAncestor,AncestorType='System.Windows.Window',AncestorLevel='1'的绑定源。BindingExpression:(无路径);DataItem=null;目标元素是“ObjectAnimationUsingKeyFrames”(HashCode=51442863);目标属性为“target”(类型为“DependencyObject”)
System.Windows.Data错误:40:BindingExpression路径错误:“对象”“按钮”(名称=“”)上找不到WindowsState属性。空的
引发异常:PresentationFramework.dll中的“System.InvalidOperationException”
PresentationFramework.dll中发生类型为“System.InvalidOperationException”的未处理异常
无法解析属性路径“WindowsState”中的所有属性引用。验证适用对象是否支持这些属性
谢谢你,它工作得很好,但是怎么做呢?你能解释一下标签是如何保存窗口的吗?@Mamad
tag
属于object
类型,所以它可以保存对任何东西的引用。绑定将对窗口的引用分配给标记
。您在故事板上的原始绑定。Target
试图将窗口的引用分配给故事板。Target
--同样的原则,只是您不幸尝试在相对资源绑定的必要上下文不可用的地方进行绑定。我有一个新问题。我创建了两个按钮,一个用于最大化状态,一个用于正常状态。如果我只使用这两个按钮,则没有问题。我试图通过窗口的最大化按钮来最大化我的窗口,但我的样式正常的按钮不起作用!!如果我通过单击窗口的最大化按钮来最大化窗口,则我的样式化普通按钮不起作用。因此,如果我单击样式化最大化按钮,则样式化普通按钮再次起作用。有什么问题?@Mamad我怎么可能知道你的新代码出了什么问题,而我还没有看到它呢?@Mamad看起来可能是个问题:一旦你通过标题栏按钮设置属性值,它的优先级将高于动画设置器,而设置器的值将被忽略。在这种情况下,忽略整个样式/故事板/动画,只需在这些单击处理程序中为WindowsState指定一个新值。有点扫兴,但会有用的。