WPF: Наследование из окна - PullRequest
       20

WPF: Наследование из окна

4 голосов
/ 01 января 2011

Кажется, у меня возникли проблемы с созданием пользовательского типа окна, производного от System.Windows.Window.Кажется, есть две проблемы, которые происходят.Во-первых, во время компиляции возникает ошибка:

Не удается найти статический член 'ContentProperty' для типа 'Control'

Это относится к элементу ContentPresenter вControlTemplate для пользовательского окна (см. пример кода для BaseWindowResource.xaml ниже).Я не знаю, почему это происходит, поскольку BaseWindow происходит от Window и, следовательно, должно иметь свойство Content ...

Вторая проблема заключается в том, что я не могу получить событие ContentRendered дляBaseWindow для запуска, когда Window1, производное от BaseWindow, завершило рендеринг ... Мне нужно обработать событие ContentRendered в BaseWindow, так как обработчик будет содержать много кода, который в противном случае пришлось бы копировать в каждый производный класс ...

В любом случае, вот код.Любая помощь будет высоко ценится!

Приветствия,

Андрей

App.xaml:

<Application x:Class="WpfApplication4.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             StartupUri="Window1.xaml">
    <Application.Resources>
        <ResourceDictionary Source="/BaseWindowResource.xaml" />
    </Application.Resources>
</Application>

BaseWindowResource.xaml:

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                    xmlns:local="clr-namespace:WpfApplication4">
    <Style TargetType="{x:Type local:BaseWindow}" x:Key="BaseWindowStyleKey">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate>
                    <Grid>
                        <Rectangle Margin="20" Fill="Green" x:Name="MyRect" />
                        <ContentPresenter Margin="30" x:Name="MyContentPresenter"
                                          Content="{TemplateBinding Content}"
                                          ContentTemplate="{TemplateBinding ContentTemplate}" />
                    </Grid>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</ResourceDictionary>

BaseWindow.cs:

    public class BaseWindow : Window
    {
        public BaseWindow()
        {
            Style = FindResource("BaseWindowStyleKey") as Style;

            ContentRendered += new EventHandler(BaseWindow_ContentRendered);
        }

        void BaseWindow_ContentRendered(object sender, EventArgs e)
        {
            ContentPresenter contentPresenter = Template.FindName("MyContentPresenter", this) as ContentPresenter;

            MessageBox.Show(String.Format("The dimensions for the content presenter are {0} by {1}",
                contentPresenter.ActualWidth,
                contentPresenter.ActualHeight));
        }
    }

Window1.xaml:

<local:BaseWindow x:Class="WpfApplication4.Window1"
                  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                  xmlns:local="clr-namespace:WpfApplication4"
                  Title="Window1" Height="300" Width="300">
</local:BaseWindow>

и, наконец, Window1.xaml.cs:

public partial class Window1 : BaseWindow
{
    public Window1()
    {
        InitializeComponent();
    }
}

Ну, этовесь код.Это в значительной степени изолирует проблемы.

Приветствия,

Andrew

Ответы [ 2 ]

8 голосов
/ 01 января 2011

Попробуйте указать тип следующим образом:

Content="{TemplateBinding Window.Content}"

Я думаю, что вторая проблема связана с первой. Оставьте комментарий здесь, если второе не решено этим решением.

1 голос
/ 14 ноября 2014

добавление TargetType должно решить проблему

example

 <ControlTemplate TargetType="Window">
...