0

我正在尝试访问 a Controlin a Template。为此,我重新定义了控制CalendarDayButton

<Window.Resources>
    <Style x:Key="myStyleDayButtonCalendar" TargetType="{x:Type CalendarDayButton}">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type CalendarDayButton}">
                    <Grid  Name="gridCalendar">
                        <ContentControl Margin="5,1,5,1" Content="{TemplateBinding Content}"/>
                    </Grid>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</Window.Resources>

<Grid x:Name="LayoutRoot" Background="White">
    <Calendar CalendarDayButtonStyle="{StaticResource myStyleDayButtonCalendar}" Name="myCalendar"  SelectedDatesChanged="Calendar_SelectedDatesChanged_1" />
</Grid>

没关系。但是当我想访问我的控制网格时。不可能的:

private void Calendar_SelectedDatesChanged_1(object sender, SelectionChangedEventArgs e)
{
    Grid gridInTemplate = (Grid)myCalendar.Template.FindName("gridCalendar", myCalendar) as Grid;
}

我的网格是null. 所以,我尝试了另一个Control. 有一个Button

<Window.Resources>
   <Style x:Key="myStyleButton" TargetType="{x:Type Button}">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type Button}">
                    <Grid  Name="myButton">
                        <Ellipse Fill="DarkBlue"></Ellipse>
                    </Grid>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</Window.Resources>

<Grid x:Name="LayoutRoot" Background="White">
    <Calendar CalendarDayButtonStyle="{StaticResource myStyleDayButtonCalendar}" Name="myCalendar"  SelectedDatesChanged="Calendar_SelectedDatesChanged_1" />
    <Button Style="{StaticResource myStyleButton}" Name="myButton2" Margin="92,99,518,338" Click="myButton2_Click_1"></Button>
</Grid>

后面的代码:

private void myButton2_Click_1(object sender, RoutedEventArgs e)
{
    Grid gridInTemplate = (Grid)myButton2.Template.FindName("myButton", myButton2);
}

这里 gridInTemplate 是NOT NULL. 为什么在这种情况下 dayCalendarButton gridInTemplate 是NULL?我想避免使用VisualTreeHelper.

4

1 回答 1

0

在您的情况下,您试图在日历中找到一个 CalendarDayButton。但这是两种不同的控制。例如,我们有一个日历样式:

    <Style TargetType="{x:Type Calendar}">            
        <Setter Property="SnapsToDevicePixels" Value="True" />
        <Setter Property="BorderBrush" Value="Gray" />
        <Setter Property="BorderThickness" Value="1"/>

        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type Calendar}">
                    <StackPanel x:Name="PART_Root" HorizontalAlignment="Center">
                        <CalendarItem x:Name="PART_CalendarItem" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" />
                    </StackPanel>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

在代码中,我们可以像这样访问 StackPanel:

    private void Calendar_SelectedDatesChanged(object sender, SelectionChangedEventArgs e)
    {
        StackPanel StackPanelInTemplate = (StackPanel)MyCalendar.Template.FindName("PART_Root", MyCalendar) as StackPanel;          
        MessageBox.Show(StackPanelInTemplate.Name);     
    }

但它在日历样式中并不存在CalendarDayButton。这是一个单独的控件。在 CalendarDayButton 我们只能获取样式:

Style MyCalendarDayButton = (Style)MyCalendar.CalendarDayButtonStyle;       

但不是模板。表格的构造:

CalendarDayButton MyCalendarDayButton = FindChild<CalendarDayButton>(MyCalendar, "gridCalendar");   

不起作用。不起作用,因为它与日历不在同一可视树中。

结论:可能只是访问 CalendarDayButton 将不起作用,因为它在日历的可视化树中看不到(开发人员已经设计了)。虽然我可能弄错了。我在使用 DatePicker 时遇到了类似的问题。不能简单地访问 DatePicker 的某些部分,例如:访问 Watermark - http://matthamilton.net/datepicker-watermark

这个决定取决于你为什么需要这个按钮。尝试在控件、样式等触发器中移动您的功能,或者创建您自己的控件,继承自 CalendarDayButton 类(这很烦人)。我们使用转换器,例如:

<Grid x:Name="CalendarDayButtonGrid">                         
    <Grid.ToolTip>
          <MultiBinding Converter="{StaticResource HighlightDate}">
              <MultiBinding.Bindings>
                  <Binding />
                    <Binding RelativeSource="{RelativeSource FindAncestor, 
                               AncestorType={x:Type Calendar}}" />
              </MultiBinding.Bindings>
          </MultiBinding>
    </Grid.ToolTip>
    <!-- End addition -->
</Grid>

PS 这里告诉你如何使用 WPF ToolKit 访问 CalendarDayButton:http ://codesticks.wordpress.com/tag/wpf-toolkit/

于 2013-06-11T06:55:45.453 回答