代码之家  ›  专栏  ›  技术社区  ›  Ben

更改按钮上的内容模板单击Wpf

  •  -1
  • Ben  · 技术社区  · 7 年前

    我有以下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时一样。

    后面的代码如下所示,但当我单击按钮时,窗口关闭,没有结果。

    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())
    

    为什么模板不会改变?

    非常感谢。

    1 回复  |  直到 7 年前
        1
  •  0
  •   Rowbear    7 年前

    我不熟悉ironpython,但在您的点击处理程序中,似乎您正在设置窗口的ContentTemplate,这似乎不正确。我假设您的detailedErrorTemplate应该应用于您的ContentControl。在这种情况下,您需要将x:Name添加到ContentControl(即:x:Name=“ContentControl”)中,以便在代码中引用ContentControl并设置(在c中)

    TheContentControl.Template = this.Resources["detailedErrorTemplate"] as ControlTemplate;
    

    您的资源有键,而不是名称,因此您需要按键索引资源字典。

    编辑 基于评论的详细信息。

    1. 在xaml中,更改行

      <ContentControl>
      

     <ContentControl x:Name="TheContentControl">
    
    1. 既然我们现在有了ContentControl的名称,您可以适当地更改ContentControl的ControlTemplate(而不是窗口。我知道您的ContentControl实际上包含了窗口,但您不能像这样将用于ContentControl的ControlTemplate分配给窗口)。将代码行更改为:

      self.ContentTemplate = Window.Resources.FindName(self,'detailedErrorTemplate')
      

    to(我希望语法正确)。

     self.TheContentControl.Template = self.Resources['detailedErrorTemplate']