2015-09-07 50 views
0

我們即將轉移到WPF,目前正在模板化窗口上工作。WPF自定義窗口模板無內容

經過幾個小時的閱讀和下面的CodeProject和StackOverflow教程我正在努力與一個,我相信很簡單,透明度方面的問題。

Solution Overview

How it looks in the preview

當我運行應用程序,有我在窗口中沒有 「內容」。

我在Generic.xaml中定義了我的樣式,它位於Themes文件夾中。

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
       xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
       xmlns:local="clr-namespace:MTApp" 
       x:Class="MTApp.Themes.Generic"> 

<ControlTemplate x:Key="WindowTemplate" TargetType="{x:Type Window}"> 
    <Grid x:Name="WindowRoot"> 
     <Border x:Name="WindowFrame"> 
      <Grid Margin="0" VerticalAlignment="Top" MouseDown="Window_MouseDown"> 

       <Grid.ColumnDefinitions> 
        <ColumnDefinition Width="25"/> 
        <ColumnDefinition Width="75*"/> 
        <ColumnDefinition Width="75"/> 
        <ColumnDefinition Width="25"/> 
       </Grid.ColumnDefinitions> 
       <Grid.RowDefinitions> 
        <RowDefinition Height="40" /> 
        <RowDefinition Height="30" /> 
        <RowDefinition Height="35" /> 
        <RowDefinition Height="35" /> 
        <RowDefinition Height="140*" /> 
       </Grid.RowDefinitions> 
       <Frame x:Name="background" Grid.Column="0" Grid.ColumnSpan="4" Grid.Row="0" Background="#ddd" BorderThickness="0 0 0 1" BorderBrush="#c9c9c9"/> 

       <Label x:Name="windowTitle" Grid.ColumnSpan="2" Content="Title Bar" VerticalAlignment="Center" Foreground="#393939" Grid.Row="0" Grid.Column="1" HorizontalAlignment="Center" FontFamily="Segoe UI Regular" FontSize="12"/> 
       <Grid Grid.Column="2" Grid.ColumnSpan="2" Grid.Row="0"> 
        <Grid.ColumnDefinitions> 
         <ColumnDefinition Width="50"/> 
         <ColumnDefinition Width="13"/> 
         <ColumnDefinition Width="14"/> 
         <ColumnDefinition Width="13"/> 
         <ColumnDefinition Width="*"/> 
        </Grid.ColumnDefinitions> 
        <Grid.RowDefinitions> 
         <RowDefinition Height="15"/> 
         <RowDefinition Height="10" /> 
         <RowDefinition Height="10" /> 
        </Grid.RowDefinitions> 
        <Button x:Name="minimizeBtn" Content="" Background="#39b54a" BorderThickness="0" Grid.Row="1" Grid.Column="1" Margin="3 0 0 0" Click="minimizeBtn_Click"/> 
        <Button x:Name="maximizeBtn" Content="" Background="#f8be3f" BorderThickness="0" Grid.Row="1" Grid.Column="2" Margin="3 0 0 0" Click="maximizeBtn_Click"/> 
        <Button x:Name="quitBtn" Content="" Background="#f84646" BorderThickness="0" Click="quitBtn_Click" Grid.Row="1" Grid.Column="3" Margin="3 0 0 0"/> 
       </Grid> 
      </Grid> 
     </Border> 
    </Grid> 
</ControlTemplate> 

<Style x:Key="SkinWindowStyle" TargetType="Window"> 
    <Setter Property="WindowStyle" Value="None" /> 
    <Setter Property="AllowsTransparency" Value="True" /> 
    <Setter Property="Background" Value="#ffffff" /> 
    <Setter Property="Opacity" Value="100" />   
    <Setter Property="ResizeMode" Value="CanResize" /> 
    <Setter Property="Width" Value="600" /> 
    <Setter Property="Height" Value="300" /> 
    <Setter Property="Template" Value="{StaticResource WindowTemplate}" /> 

    <Style.Triggers> 
     <DataTrigger Binding="{Binding WindowState}" Value="Maximized"> 
     </DataTrigger> 
    </Style.Triggers> 
</Style> 

它定義「WindowStyle」和「AllowsTransparency」因爲看到很多教程,如果我設置「AllowsTransparancy」爲假,我會得到一個邊界全黑色的窗口。

正如你可以從風格已經看到,我想要背景爲白色。但我所得到的只是一個「空白」的窗口。我想強制一些智慧,就像你從其他二傳手中看到的那樣。

我MainWindow.xaml,這是實際工作的應用程序是這樣的:

<Window x:Class="MTApp.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Style="{DynamicResource SkinWindowStyle}"  
    Background="White" 
    Height="300" 
    Width="350"   
    > 
<Grid Background="White" Height="100" Width="200">   
    <TextBlock Text="Test" Grid.Row="1" Grid.Column="1" Grid.ColumnSpan="2" Background="White"/> 
</Grid> 

它使用Generic.xaml定義的風格,這一切工作正常。當然,背景,高度和寬度不能覆蓋樣式的屬性,因爲它的硬編碼,但仍然應顯示網格以及文本框。但是沒有一個出現。

最後,Generic.xaml.cs:

using System; 
using System.Windows; 
using System.Windows.Input; 

namespace MTApp.Themes 
{ 
    public partial class Generic : ResourceDictionary 
    { 

     public Generic() 
     { 
      InitializeComponent(); 
     } 

     /** 
     * Header Buttons Events 
     **/ 
     private void minimizeBtn_Click(object sender, RoutedEventArgs e) 
     { 
      Application.Current.MainWindow.WindowState = WindowState.Minimized; 
     } 

     private void maximizeBtn_Click(object sender, RoutedEventArgs e) 
     { 
      if (Application.Current.MainWindow.WindowState == WindowState.Maximized) 
      { 
       Application.Current.MainWindow.WindowState = WindowState.Normal; 
      } 
      else 
      { 
       Application.Current.MainWindow.WindowState = WindowState.Maximized; 
      } 

     } 

     private void quitBtn_Click(object sender, RoutedEventArgs e) 
     { 
      Window.GetWindow(((FrameworkElement)e.Source)).Close(); 
     } 

     /** 
     * Window Events 
     **/ 
     private void Window_MouseDown(object sender, MouseButtonEventArgs e) 
     { 

      if (e.ChangedButton == MouseButton.Left) 
      { 
       Window.GetWindow(((FrameworkElement)e.Source)).DragMove(); 
      } 

     } 

    } 
} 

你要知道,它從資源字典衍生,我不能把它從「窗口」工作作爲5個教程可在網上看到...

所以在這裏我的問題,爲什麼沒有顯示在我的自定義內容下面?我是否需要指定一個特定的畫布,然後我們可以將每個窗口的控件放入其中?認爲登錄窗口,選項窗口,消息/確認窗口。他們應該都具有相同的風格,因此我們希望窗口模板化。

回答

1

要允許向窗口添加控件,您需要將ContentPresenter控件添加到ControlTemplate。以下內容添加到模板代碼:

<ControlTemplate x:Key="WindowTemplate" TargetType="{x:Type Window}"> 
    <Grid x:Name="WindowRoot"> 
     <Border x:Name="WindowFrame"> 
      <Grid Margin="0" VerticalAlignment="Top"> 

       <Grid.ColumnDefinitions> 
        ... 
       </Grid.ColumnDefinitions> 
       <Grid.RowDefinitions> 
        ... 
       </Grid.RowDefinitions> 

       ... header controls ... 

       <ContentPresenter Grid.Column="0" Grid.ColumnSpan="4" Grid.Row="1"/> 
      </Grid> 
     </Border> 
    </Grid> 
</ControlTemplate> 

當然,ContentPresenterGrid.RowGrid.Column設置需要進行調整,這取決於你想在那裏要插入的窗口內容。

+0

哇,太簡單了。謝謝 !像魅力一樣工作。 – Richard