更改按钮上的内容模板单击 Wpf
Change Content Template on Button Click Wpf
我有以下 XAML:
<Window
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="WpfApplication4" Height="300" Width="300">
<Window.Resources>
<ControlTemplate x:Key="simpleErrorTemplate">
<TextBox Margin="10,10,10,5" TextWrapping="Wrap" VerticalScrollBarVisibility="Auto" Text="T1" />
</ControlTemplate>
<ControlTemplate x:Key="detailedErrorTemplate">
<StackPanel>
<TextBox Margin="10,10,10,5" TextWrapping="Wrap" VerticalScrollBarVisibility="Auto" Text="T2" />
<TextBox Margin="10,10,10,5" TextWrapping="Wrap" VerticalScrollBarVisibility="Auto" Text="T3" />
<TextBox Margin="10,10,10,5" TextWrapping="Wrap" VerticalScrollBarVisibility="Auto" Text="T4" />
</StackPanel>
</ControlTemplate>
</Window.Resources>
<Grid>
<ContentControl>
<ContentControl.Style>
<Style TargetType="ContentControl">
<Setter Property="Template"
Value="{StaticResource simpleErrorTemplate}"/>
<Style.Triggers>
<DataTrigger Binding="{Binding ElementName=Button,Path=IsPressed}" Value="True">
<Setter Property="Template" Value="{StaticResource detailedErrorTemplate}"/>
</DataTrigger>
</Style.Triggers>
</Style>
</ContentControl.Style>
</ContentControl>
<Button x:Name="Button" Content="Button" Height="40" Width="129" Margin="88,5,76,5" Grid.Row="1" Click="Button_Click1"/>
</Grid>
</Window>
我想在单击按钮时更改 GUI 样式,就像为复选框设置 DataTrigger 时发生的那样。
后面的代码如下所示,但是当我单击按钮时 window 关闭并且没有结果。
import wpf
from System.Windows import Application, Window
class MyWindow(Window):
def __init__(self):
self.ui = wpf.LoadComponent(self, 'WpfApplication4.xaml')
def Button_Click1(self, sender, e):
self.ContentTemplate = Window.Resources.FindName(self,'detailedErrorTemplate')
if __name__ == '__main__':
Application().Run(MyWindow())
为什么模板不会改变?
谢谢。
我不熟悉 ironpython,但在您的点击处理程序中,您似乎正在设置 window 的 ContentTemplate,这似乎不正确。我假设您的 detailedErrorTemplate 应该适用于您的 ContentControl。在这种情况下,您需要将 x:Name 添加到您的 ContentControl(即:x:Name="TheContentControl")以便在后面的代码中引用 ContentControl 并设置(在 c# 中)
TheContentControl.Template = this.Resources["detailedErrorTemplate"] as ControlTemplate;
您有资源的键,而不是名称,因此您需要通过键为资源字典编制索引。
根据评论编辑 详细信息。
在您的 xaml 中,更改您的线路
<ContentControl>
到
<ContentControl x:Name="TheContentControl">
由于我们现在有了 ContentControl 的名称,您可以正确更改 ContentControl 的 ControlTemplate(不是 window。我知道您的 ContentControl 有效地包含了 Window,但您不能像那样将用于 ContentControl 的 ControlTemplate 分配给 Window)。更改您的代码行:
self.ContentTemplate = Window.Resources.FindName(self,'detailedErrorTemplate')
to(我希望我的语法正确)。
self.TheContentControl.Template = self.Resources['detailedErrorTemplate']
我有以下 XAML:
<Window
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="WpfApplication4" Height="300" Width="300">
<Window.Resources>
<ControlTemplate x:Key="simpleErrorTemplate">
<TextBox Margin="10,10,10,5" TextWrapping="Wrap" VerticalScrollBarVisibility="Auto" Text="T1" />
</ControlTemplate>
<ControlTemplate x:Key="detailedErrorTemplate">
<StackPanel>
<TextBox Margin="10,10,10,5" TextWrapping="Wrap" VerticalScrollBarVisibility="Auto" Text="T2" />
<TextBox Margin="10,10,10,5" TextWrapping="Wrap" VerticalScrollBarVisibility="Auto" Text="T3" />
<TextBox Margin="10,10,10,5" TextWrapping="Wrap" VerticalScrollBarVisibility="Auto" Text="T4" />
</StackPanel>
</ControlTemplate>
</Window.Resources>
<Grid>
<ContentControl>
<ContentControl.Style>
<Style TargetType="ContentControl">
<Setter Property="Template"
Value="{StaticResource simpleErrorTemplate}"/>
<Style.Triggers>
<DataTrigger Binding="{Binding ElementName=Button,Path=IsPressed}" Value="True">
<Setter Property="Template" Value="{StaticResource detailedErrorTemplate}"/>
</DataTrigger>
</Style.Triggers>
</Style>
</ContentControl.Style>
</ContentControl>
<Button x:Name="Button" Content="Button" Height="40" Width="129" Margin="88,5,76,5" Grid.Row="1" Click="Button_Click1"/>
</Grid>
</Window>
我想在单击按钮时更改 GUI 样式,就像为复选框设置 DataTrigger 时发生的那样。
后面的代码如下所示,但是当我单击按钮时 window 关闭并且没有结果。
import wpf
from System.Windows import Application, Window
class MyWindow(Window):
def __init__(self):
self.ui = wpf.LoadComponent(self, 'WpfApplication4.xaml')
def Button_Click1(self, sender, e):
self.ContentTemplate = Window.Resources.FindName(self,'detailedErrorTemplate')
if __name__ == '__main__':
Application().Run(MyWindow())
为什么模板不会改变?
谢谢。
我不熟悉 ironpython,但在您的点击处理程序中,您似乎正在设置 window 的 ContentTemplate,这似乎不正确。我假设您的 detailedErrorTemplate 应该适用于您的 ContentControl。在这种情况下,您需要将 x:Name 添加到您的 ContentControl(即:x:Name="TheContentControl")以便在后面的代码中引用 ContentControl 并设置(在 c# 中)
TheContentControl.Template = this.Resources["detailedErrorTemplate"] as ControlTemplate;
您有资源的键,而不是名称,因此您需要通过键为资源字典编制索引。
根据评论编辑 详细信息。
在您的 xaml 中,更改您的线路
<ContentControl>
到
<ContentControl x:Name="TheContentControl">
由于我们现在有了 ContentControl 的名称,您可以正确更改 ContentControl 的 ControlTemplate(不是 window。我知道您的 ContentControl 有效地包含了 Window,但您不能像那样将用于 ContentControl 的 ControlTemplate 分配给 Window)。更改您的代码行:
self.ContentTemplate = Window.Resources.FindName(self,'detailedErrorTemplate')
to(我希望我的语法正确)。
self.TheContentControl.Template = self.Resources['detailedErrorTemplate']