【问题标题】:how to find controls in custom window in wpf如何在wpf的自定义窗口中找到控件
【发布时间】:2015-03-17 16:52:23
【问题描述】:


我为 Window 设计了一个表单模板,并命名为“WindowStyle1”:

<Style x:Key="WindowStyle1" TargetType="{x:Type Window}">
    <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.WindowTextBrushKey}}"/>
    <Setter Property="Background" Value="{DynamicResource {x:Static SystemColors.WindowBrushKey}}"/>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type Window}">
                <Border Height="Auto" Width="Auto" Background="#FF27C986" Margin="10">
                    <Border.Effect>
                        <DropShadowEffect ShadowDepth="0" Direction="180" Opacity="0.52" BlurRadius="10"/>
                    </Border.Effect>
                    <Grid Loaded="OnWindowLoaded">
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition/>
                            <ColumnDefinition Width="94"/>
                        </Grid.ColumnDefinitions>
                        <Grid.RowDefinitions>
                            <RowDefinition Height="38"/>
                            <RowDefinition/>
                        </Grid.RowDefinitions>
                        <Border BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" Grid.RowSpan="1" Grid.Row="1" Grid.ColumnSpan="2">
                            <AdornerDecorator>
                                <ContentPresenter/>
                            </AdornerDecorator>
                        </Border>
                        <Button Click="minimize_window" x:Name="btn_window_minimize" Grid.Column="1" HorizontalAlignment="Left" Margin="4.565,9.5,0,0" VerticalAlignment="Top" Width="20" Height="19.96" Style="{DynamicResource ButtonStyle_Windows_MinimumSize}" BorderThickness="1"/>
                        <Button Click="maximize_window" x:Name="btn_window_maximize" Grid.Column="1" HorizontalAlignment="Left" Margin="34.565,9.5,0,0" VerticalAlignment="Top" Width="20" Height="19.96" Style="{DynamicResource ButtonStyle_Windows_MaximumSize}"/>
                        <Button Click="close_window" x:Name="btn_window_close" Grid.Column="1" HorizontalAlignment="Left" Margin="64,9.5,0,0" VerticalAlignment="Top" Width="20" Height="19.96" Style="{DynamicResource ButtonStyle_Windows_Close}"/>
                        <Grid MouseLeftButtonDown="Window_MouseLeftButtonDown" HorizontalAlignment="Stretch" Height="38" VerticalAlignment="Top" Background="#FF27C986">
                            <Label Name="lbl_title" Content="Label" HorizontalAlignment="Left" Margin="0.998,0,0,0" VerticalAlignment="Top" FontSize="20" Foreground="White"/>
                        </Grid>
                    </Grid>
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
    <Style.Triggers>
        <Trigger Property="ResizeMode" Value="CanResizeWithGrip">
            <Setter Property="Template" Value="{StaticResource WindowTemplateKey}"/>
        </Trigger>
    </Style.Triggers>
</Style>

我将此 .xaml 文件绑定到“Window.cs”类:

namespace WpfApplication2
{
    partial class Window : ResourceDictionary
    {
        public Windows()
        {
            InitializeComponent();
        }
    }
}

但我在“MainWindow.xaml”中找不到按钮控件。

主要问题:
如何在wpf中找到自定义窗口样式中定义的标签控件

有什么想法吗? 请原谅我的英语不好!

【问题讨论】:

    标签: c# wpf xaml wpf-controls


    【解决方案1】:

    您需要在 Loaded 事件中(或以后)执行此操作。

    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            var label = Template.FindName("lbl_title", this) as Label;
            Loaded += MainWindow_Loaded;
        }
    
        void MainWindow_Loaded(object sender, RoutedEventArgs e)
        {
            var label = Template.FindName("lbl_title", this) as Label;
        }
    }
    

    【讨论】:

      【解决方案2】:

      试试这个:

      this.GetTemplateChild("minimize_window");
      

      你可以了解更多关于这个方法here.

      WPF 中的模板具有独立的名称范围。这是因为模板被重复使用,并且当一个控件的多个实例分别实例化其模板时,模板中定义的任何名称都不能保持唯一。

      【讨论】:

        【解决方案3】:

        您可以使用FrameworkTemplate.FindName Method 查找已在ControlTemplate 中定义的元素,它查找与此模板中定义的指定名称相关联的元素

        您可以在 MSDN 上的 How to: Find ControlTemplate-Generated Elements 页面中看到完整的故事,但这里是从链接页面中截取的一个简短示例,可以给您一个想法:

        // Finding the grid that is generated by the ControlTemplate of the Button
        Grid gridInTemplate = (Grid)myButton1.Template.FindName("grid", myButton1);
        // Do something to the ControlTemplate-generated grid
        MessageBox.Show("The actual width of the grid in the ControlTemplate: "
            + gridInTemplate.GetValue(Grid.ActualWidthProperty).ToString());
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-10-01
          • 1970-01-01
          • 1970-01-01
          • 2013-03-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多