将模板应用于wpf窗口时出现神秘的运行时错误

时间:2011-07-21 10:33:18

标签: c# wpf wpf-controls

我在处理模板时遇到了一个难题。请帮帮我。

的App.xaml

<Application x:Class="WpfApplication1.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">

//Note i didn't set a StartupURI in Application tag please.

    <Application.Resources>

        <Style TargetType="Window" x:Key="myWindowStyle">
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate>
                        <Grid>
                            <Rectangle Fill="gray" RadiusX="30" RadiusY="30"/>
                            <ContentPresenter/>
                        </Grid>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>

    </Application.Resources>
</Application>

App.xaml.cs

using System;
using System.Windows;

namespace WpfApplication1
{
    public partial class App : Application
    {

        CMainWindow winMain;

        protected override void OnStartup(StartupEventArgs e)
        {
            base.OnStartup(e);

            winMain = new CMainWindow();
            winMain.ShowDialog();

        }

    }
}

CMainWindow.xaml

<Window x:Class="WpfApplication2.CMainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525" Style="{StaticResource myWindowStyle}" Background="Red">
</Window>

=====================

问题#1

运行此程序时,ide会发生运行时错误:XmlParseException。 所以我在app.xaml中添加一行,它运行正常。该行是:StartupUri =“CMainWindow.xaml”。

这是什么?模板和startupuri之间有什么关系?请告诉我这个。

问题#2

当我向CMainWindow添加控件时,即使我在窗口的模板中设置了它也没有。

如何在这种情况下正确添加控件?

感谢。

1 个答案:

答案 0 :(得分:2)

问题#1 WPF应用程序始终以窗口为中心。你不需要重写OnStartup。通过设置StartupURI,应用程序将通过显示窗口自动启动。

模板和startupuri之间没有实际关系。您恰巧正在使用App.xaml来存储全局样式。

问题#2

要添加的魔术字段是控件模板上的“TargetType”。你必须明确说出它的窗口类型。

<Application x:Class="SimpleWPF.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             StartupUri="MainWindow.xaml">
    <Application.Resources>
        <Style TargetType="Window" x:Key="myWindowStyle">
            <Setter Property="Template">
                <Setter.Value>
                    <!-- Explicitly setting TargetType to Window -->
                    <ControlTemplate TargetType="Window">
                        <Grid>

                            <Rectangle Fill="gray" RadiusX="30" RadiusY="30"/>  
                            <ContentPresenter/>
                        </Grid>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </Application.Resources>
</Application>