Что может привести к игнорированию моего шаблона в этом пользовательском элементе управления - PullRequest
1 голос
/ 18 мая 2011

РЕДАКТИРОВАТЬ: Исходное название: Когда я добавляю пользовательский элемент управления на основе таймера, мои шаблоны игнорируются.

Я работаю над 70-511 учебным комплектом от Microsoft Press и объединил два упражнения из главы 5.

Проблема в том, что когда я добавляю пользовательский элемент управления в мое MainWindow, он запускается, но триггеры в шаблоне Button игнорируются. Когда тот же элемент управления удален, триггеры соблюдаются.

Для тех, кто не имеет доступа к книге и не хочет анализировать код, это пользовательский элемент управления с меткой, которая имеет настройку свойства зависимостей для обновления объекта таймера (один раз в секунду) с помощью текущее системное время.

Как вы можете понять из моего прикрепленного кода, пользовательский элемент управления находится в отдельной сборке, на которую ссылается проект 5_3.

Я немного озадачен этим. Чем это вызвано?

Вот код:

MainWindow.xaml:

<Window x:Class="chapter5_3.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="350" Width="525" xmlns:my="clr-namespace:chapter5_3CustomControl;assembly=chapter5_4CustomControl">
<Window.Resources>
    <ControlTemplate TargetType="{x:Type Button}" x:Key="ButtonTemplate">

        <Border Name="Bord1" BorderBrush="Olive" BorderThickness="{TemplateBinding BorderThickness}">
            <Grid>
                <Rectangle Name="rect1">
                    <Rectangle.Fill>
                        <SolidColorBrush x:Name="rosyBrush" Color="RosyBrown"/>
                    </Rectangle.Fill>
                </Rectangle>
                <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center" />
            </Grid>
        </Border>
        <ControlTemplate.Triggers>
            <Trigger Property="IsMouseOver" Value="True" >
                <Trigger.EnterActions>
                    <BeginStoryboard Name="bst2">
                        <Storyboard AutoReverse="False">
                            <ColorAnimation Duration="0:0:.3"
                                            Storyboard.TargetProperty="Color" 
                                            Storyboard.TargetName="rosyBrush" >
                                <ColorAnimation.By>
                                    <Color A="0" R="100" B="0" G="0"/>
                                </ColorAnimation.By>
                            </ColorAnimation>
                        </Storyboard>
                    </BeginStoryboard>

                </Trigger.EnterActions>
                <Trigger.ExitActions>
                    <StopStoryboard BeginStoryboardName="bst2" />
                </Trigger.ExitActions>
            </Trigger>
            <Trigger Property="IsPressed" Value="True">
                <Trigger.EnterActions>
                    <BeginStoryboard Name="bst1">
                        <Storyboard>
                            <ThicknessAnimation Storyboard.TargetName="Bord1"
                 Storyboard.TargetProperty="BorderThickness"
                 By=".1" Duration="0:0:.3" />
                            <ColorAnimation AutoReverse="False" To="DarkRed" Duration="0:0:.3"
                                            Storyboard.TargetProperty="Color" 
                                            Storyboard.TargetName="rosyBrush" />
                        </Storyboard>
                    </BeginStoryboard>
                </Trigger.EnterActions>
                <Trigger.ExitActions>
                    <StopStoryboard BeginStoryboardName="bst1" />
                </Trigger.ExitActions>
            </Trigger>
            <Trigger Property="IsEnabled" Value="False">
                <Setter TargetName="rect1" Property="Fill" Value="Gray"></Setter>
            </Trigger>
        </ControlTemplate.Triggers>
    </ControlTemplate>
</Window.Resources>
<Grid>
    <Button Template="{StaticResource ResourceKey=ButtonTemplate}" Height="23" Width="100" BorderThickness="2" Name="btnHello" Content="Hello" IsEnabled="False">

    </Button>
    <ToolBarPanel>
        <CheckBox IsChecked="True" Content="Enable Button" Name="cbEnabled" Checked="cbEnabled_Checked" Unchecked="cbEnabled_Checked"/>

    </ToolBarPanel>
    <my:CustomControl1 Name="customControl11" />
</Grid>

CustomControl1.xaml: (отдельная сборка)

<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:chapter5_3CustomControl">
<Style TargetType="{x:Type local:CustomControl1}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type local:CustomControl1}">
                <Border Background="{TemplateBinding Background}"
                        BorderBrush="{TemplateBinding BorderBrush}"
                        BorderThickness="{TemplateBinding BorderThickness}">
                    <TextBlock Foreground="{TemplateBinding Foreground}" HorizontalAlignment="Center"
                                   Text="{Binding Path=Time}" />
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

CustomControl.cs

public class CustomControl1 : Control
{

    public static readonly DependencyProperty TimeProperty;

    System.Timers.Timer myTimer = new System.Timers.Timer();

    delegate void SetterDelegate();

    static CustomControl1()
    {
        FrameworkPropertyMetadata metadata = new FrameworkPropertyMetadata();
        TimeProperty = DependencyProperty.Register("Time", typeof(string), typeof(CustomControl1), metadata);

        DefaultStyleKeyProperty.OverrideMetadata(typeof(CustomControl1), new FrameworkPropertyMetadata(typeof(CustomControl1)));
    }

    public CustomControl1()
    {
        myTimer.Elapsed += timer_elapsed;
        myTimer.Interval = 1000;
        myTimer.Start();
        this.DataContext = this;
    }

    void TimeSetter()
    {
        SetValue(TimeProperty, DateTime.Now.ToLongTimeString());
    }

    void timer_elapsed(object sender, System.Timers.ElapsedEventArgs e)
    {
        Dispatcher.Invoke(new SetterDelegate(TimeSetter), 
            System.Windows.Threading.DispatcherPriority.Normal);

    }
}

Edit:

Я хотел подключить бесплатный инструмент под названием snoop! Вы можете найти его здесь, и я рекомендую его, поскольку он позволяет вам проверять свои элементы управления во время выполнения! Snoop Живет здесь во время редактирования: http://snoopwpf.codeplex.com/ Это сэкономило мне много времени!

1 Ответ

2 голосов
/ 18 мая 2011

Поскольку ваш Button и CustomControl находятся в одной строке и столбце таблицы, ваш CustomControl, вероятно, покрывает кнопку.Вы, вероятно, просто не можете его видеть.

Если вы установите для фона вашего CustomControl значение Red, то вы увидите, какую область он охватывает.

Вам необходимо убедиться, чтоCustomControl не покрывает кнопку, если вы хотите, чтобы кнопка реагировала на события мыши.В качестве альтернативы, вы можете установить IsHitTestVisible на false в вашем CustomControl или убедиться, что его фон равен нулю.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...