使用WPF获取工具包样式窗口

时间:2011-08-25 17:04:41

标签: c# wpf wpftoolkit

我正在使用WPF工具包和扩展的WPF工具包,并注意到当我通过以下方式显示消息框时:

MessageBox.Show("...");

我得到以下内容......

enter image description here

我想让我的主应用程序窗口也使用这个样式。有办法吗?

编辑:我尝试过WindowStyle =“ToolWindow”并且它不起作用。

编辑:回答以下答案,请参见下图:

enter image description here

此外,我希望它有一个最大化和最小化按钮,但具有与关闭按钮相同的样式。

谢谢!

4 个答案:

答案 0 :(得分:2)

你的问题很模糊。你没有说任何你想要的MessageBox风格的哪个部分,但我想我知道你在问什么(相同的颜色和窗口铬)。

由于您使用的是MessageBox的扩展工具包版本,因此您有两种选择。

首先,您可以切换Xaml中的Window的每个实例,并将其替换为extToolkit:ChildWindow(extToolkit是xmlns的命名空间:extToolkit =“http://schemas.microsoft .COM / WinFX的/ 2006 / XAML /演示/工具/扩展“)。

这是一个快速的选择,但让你陷入困境中。 ChildWindow缺少Title,而Caption则使用Window。如果你不自己对Windows做太多的话,这对你来说已经足够了。

您的第二个选项是使用MessageBox或ChildWindow模板中的相同样式信息来模板<ControlTemplate x:Key="ChildWindowControlTemplate1" TargetType="{x:Type extToolkit:ChildWindow}"> <Grid x:Name="Root"> <Grid.Resources> <Style x:Key="FocusVisualStyle" TargetType="{x:Type Control}"> <Setter Property="BorderBrush" Value="Black"/> <Setter Property="Background" Value="Transparent"/> <Setter Property="Margin" Value="-1"/> <Setter Property="Template"> <Setter.Value> <ControlTemplate> <Rectangle Fill="{TemplateBinding Background}" Margin="{TemplateBinding Margin}" Stroke="{TemplateBinding BorderBrush}" StrokeThickness="0.5" StrokeDashArray="4 3"> <Rectangle.RenderTransform> <TranslateTransform X="{Binding Left}" Y="{Binding Top}"/> </Rectangle.RenderTransform> </Rectangle> </ControlTemplate> </Setter.Value> </Setter> </Style> <BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverter"/> </Grid.Resources> <Grid x:Name="PART_WindowRoot" HorizontalAlignment="Left" Height="{TemplateBinding Height}" MinWidth="{TemplateBinding MinWidth}" MinHeight="{TemplateBinding MinHeight}" VerticalAlignment="Top" Width="{TemplateBinding Width}"> <Grid.RenderTransform> <TransformGroup> <ScaleTransform/> <SkewTransform/> <RotateTransform/> <TranslateTransform/> </TransformGroup> </Grid.RenderTransform> <Grid x:Name="WindowGrid"> <Border BorderBrush="{TemplateBinding WindowBorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" CornerRadius="5,5,0,0" Opacity="{TemplateBinding WindowOpacity}"/> <Grid Background="{x:Null}" Margin="0"> <Border x:Name="WindowBorder" Background="{TemplateBinding WindowBackground}" CornerRadius="4,4,0,0" Margin="1" Opacity="{TemplateBinding WindowOpacity}"/> <Border BorderBrush="White" BorderThickness="1" CornerRadius="4,4,0,0" Margin="1" Opacity="0.7"/> </Grid> </Grid> <Grid> <Grid.RowDefinitions> <RowDefinition Height="Auto" MinHeight="26"/> <RowDefinition/> </Grid.RowDefinitions> <Grid x:Name="ContentGrid" Margin="6,0,6,6" Grid.Row="1"> <Grid.RowDefinitions> <RowDefinition/> <RowDefinition Height="Auto"/> </Grid.RowDefinitions> <Border BorderBrush="White" BorderThickness="1" CornerRadius="1"/> <Border BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" CornerRadius="0.1" Margin="1"> <ContentPresenter x:Name="Content" ContentTemplate="{TemplateBinding ContentTemplate}" Content="{TemplateBinding Content}"/> </Border> </Grid> <Border x:Name="PART_DragWidget" Background="Transparent" Grid.Column="1" CornerRadius="5,5,0,0" Margin="1,1,1,0"> <Grid> <Grid x:Name="CaptionHeader" Margin="1,1,105,0" VerticalAlignment="Center"> <ContentControl x:Name="Caption" Content="{TemplateBinding Caption}" Foreground="{TemplateBinding CaptionForeground}" HorizontalAlignment="Stretch" IsTabStop="False" Margin="5,0,0,0"/> </Grid> </Grid> </Border> </Grid> <Border BorderBrush="#A5FFFFFF" BorderThickness="1,0,1,1" CornerRadius="0,0,3,3" HorizontalAlignment="Right" Margin="0,1,7,0" VerticalAlignment="Top"> <Button x:Name="PART_CloseButton" Height="17" IsTabStop="False" Style="{TemplateBinding CloseButtonStyle}" Visibility="{TemplateBinding CloseButtonVisibility}" Width="43"> <Path Data="M0.5,0.5L4.5178828,0.5 6.0620003,3.125 7.4936447,0.5 11.5,0.5 11.5,1.5476431 8.7425003,6.1201854 11.5,10.359666 11.5,11.5 7.4941902,11.5 6.0620003,8.8740005 4.5172949,11.5 0.5,11.5 0.5,10.43379 3.3059995,6.1201582 0.5,1.4676378 0.5,0.5z" Fill="#E4FFFFFF" HorizontalAlignment="Center" Height="10" Stretch="Fill" Stroke="#FF535666" VerticalAlignment="Center" Width="12"/> </Button> </Border> </Grid> </Grid> <ControlTemplate.Triggers> <Trigger Property="WindowState" Value="Closed"> <Setter Property="Visibility" Value="Collapsed"/> </Trigger> </ControlTemplate.Triggers> </ControlTemplate> 本身。扩展工具包ChildWindow的模板位于此答案的底部,但需要进行一些重新设计才能与Window的属性保持一致。您必须隐藏Window chrome并且具有无边框形式,因为Chrome已在模板中实现。

这不是最好的情况,并且扩展工具包应该拥有它自己的Window实现,说实话。

如果我是你,我会尝试将Windows for ChildWindows切换为开始。

HTH。

这是模板 -

{{1}}

答案 1 :(得分:1)

将其添加到xaml编辑器中的窗口标记

WindowStyle = “工具窗口”

答案 2 :(得分:1)

我想在这里添加一个免责声明,我很快就出于好奇而把它扔到了一起,比什么都重要。我没有测试过这么多,除了在那里放几个控件并运行它。它有效,但不应该被认为是完全完整的。我也认为可能有更好的方法来做到这一点,但我认为这至少会给你一个良好的起点。

向项目添加新的ResourceDictionary,并添加以下XAML:

<ResourceDictionary
  x:Class="CustomWindow.BaseResource"
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
  <Style x:Key="WindowStyle" TargetType="{x:Type Window}">
    <Setter Property="BorderThickness" Value="0" />
    <Setter Property="WindowStyle" Value="None" />
    <Setter Property="ResizeMode" Value="NoResize" />
    <Setter Property="Background" Value="White" />
    <Setter Property="Template">
      <Setter.Value>
        <ControlTemplate TargetType="{x:Type Window}">
          <Border
            x:Name="WindowBorder"
            BorderBrush="Black"
            BorderThickness="1">
            <Border.Background>
              <LinearGradientBrush StartPoint="0,0" EndPoint="0,1">
                <GradientStop Offset="0" Color="White" />
                <GradientStop Offset="1" Color="#FFDADADA" />
              </LinearGradientBrush>
            </Border.Background>
            <Grid
              Width="{TemplateBinding Width}"
              Height="{TemplateBinding Height}"
              MinWidth="{TemplateBinding MinWidth}"
              MinHeight="{TemplateBinding MinHeight}"
              HorizontalAlignment="Left"
              VerticalAlignment="Top"
              Cursor="Arrow">
              <Grid.RowDefinitions>
                <RowDefinition Height="25" />
                <RowDefinition Height="*" />
              </Grid.RowDefinitions>
              <TextBlock
                Width="500"
                Height="23"
                Margin="11,2,0,0"
                HorizontalAlignment="Left"
                VerticalAlignment="Top"
                Text="{TemplateBinding Title}" />
              <Rectangle
                x:Name="TitleBar"
                Fill="Transparent"
                MouseDown="TitleBar_MouseDown" />
              <Rectangle
                Grid.RowSpan="2"
                Width="10"
                HorizontalAlignment="Left"
                Cursor="SizeWE"
                Fill="Transparent"
                MouseDown="Border_MouseDown"
                Tag="Left" />
              <Rectangle
                Grid.RowSpan="2"
                Width="10"
                HorizontalAlignment="Right"
                Cursor="SizeWE"
                Fill="Transparent"
                MouseDown="Border_MouseDown"
                Tag="Right" />
              <Rectangle
                Height="5"
                VerticalAlignment="Top"
                Cursor="SizeNS"
                Fill="Transparent"
                MouseDown="Border_MouseDown"
                Tag="Top" />
              <Rectangle
                Grid.Row="1"
                Height="10"
                VerticalAlignment="Bottom"
                Cursor="SizeNS"
                Fill="Transparent"
                MouseDown="Border_MouseDown"
                Tag="Bottom" />
              <StackPanel
                Margin="10,0"
                HorizontalAlignment="Right"
                VerticalAlignment="Top"
                Orientation="Horizontal">
                <Button
                  x:Name="MinimizeButton"
                  Width="43"
                  Height="17"
                  Click="MinimizeButton_Click"
                  IsTabStop="False">
                  min
                </Button>
                <Button
                  x:Name="MaximizeButton"
                  Width="43"
                  Height="17"
                  Margin="5,0"
                  Click="MaximizeButton_Click"
                  IsTabStop="False">
                  max
                </Button>
                <Button
                  x:Name="CloseButton"
                  Width="43"
                  Height="17"
                  Click="CloseButton_Click"
                  IsTabStop="False">
                  <Path
                    Width="12"
                    Height="10"
                    HorizontalAlignment="Center"
                    VerticalAlignment="Center"
                    Data="M0.5,0.5L4.5178828,0.5 6.0620003,3.125 7.4936447,
                      0.5 11.5,0.5 11.5,1.5476431 8.7425003,6.1201854 11.5,
                      10.359666 11.5,11.5 7.4941902,11.5 6.0620003,8.8740005 
                      4.5172949,11.5 0.5,11.5 0.5,10.43379 3.3059995,
                      6.1201582 0.5,1.4676378 0.5,0.5z"
                    Fill="#E4FFFFFF"
                    Stretch="Fill"
                    Stroke="#FF535666" />
                </Button>
              </StackPanel>
              <Border
                Grid.Row="1"
                Margin="10,0,10,10"
                BorderBrush="Black"
                BorderThickness="1">
                <Grid>
                  <Rectangle Fill="White" />
                  <ContentPresenter Content="{TemplateBinding Content}" />
                </Grid>
              </Border>
            </Grid>
          </Border>
        </ControlTemplate>
      </Setter.Value>
    </Setter>
  </Style>
</ResourceDictionary>

为了便于说明,我们假设我们将ResourceDictionary命名为 BaseResource.xaml

接下来,将新类添加到添加资源的同一目录中,并将文件命名为 BaseResource.xaml.cs ,替换XAML文件的实际名称。

返回BaseResource.xaml并将x:Class="CustomWindow.BaseResource"属性更改为ResourceDictionary的完整类型名称。如果更改正确,Visual Studio应该抱怨BaseResource.xaml.cs中存在重复的定义。通过将partial关键字修饰符添加到.cs文件中的类来解决此问题。

最后,将以下代码添加到代码文件中:

using System;
using System.Runtime.InteropServices;
using System.Windows;
using System.Windows.Input;
using System.Windows.Interop;
using System.Windows.Media;

namespace CustomWindow
{
    public partial class BaseResource
    {
        private const uint WM_SYSCOMMAND = 0x112;

        [DllImport("user32.dll", CharSet = CharSet.Auto)]
        private static extern IntPtr 
            SendMessage(IntPtr hWnd, uint Msg, int wParam, int lParam);

        private void CloseButton_Click(object sender, RoutedEventArgs e)
        {
            e.Handled = true;
            Window.GetWindow((DependencyObject) sender).Close();
        }

        private void MinimizeButton_Click(object sender, RoutedEventArgs e)
        {
            e.Handled = true;
            Window.GetWindow((DependencyObject) sender).WindowState = WindowState.Minimized;
        }

        private void MaximizeButton_Click(object sender, RoutedEventArgs e)
        {
            e.Handled = true;
            var window = Window.GetWindow((DependencyObject) sender);
            window.WindowState = 
              (window.WindowState == WindowState.Maximized) ? WindowState.Normal : WindowState.Maximized;
        }

        private void TitleBar_MouseDown(object sender, MouseButtonEventArgs e)
        {
            e.Handled = true;
            Window.GetWindow((DependencyObject) sender).DragMove();
        }

        private void Border_MouseDown(object sender, MouseButtonEventArgs e)
        {
            e.Handled = true;
            var direction = (Direction)Enum.Parse(typeof(Direction), ((FrameworkElement)sender).Tag.ToString());
            ResizeWindow(PresentationSource.FromVisual((Visual)sender) as HwndSource, direction);
        }

        private void ResizeWindow(HwndSource hwndSource, Direction direction)
        {
            SendMessage(hwndSource.Handle, WM_SYSCOMMAND, (int)(61440 + direction), 0);
        }

        private enum Direction
        {
            Left = 1,
            Right = 2,
            Top = 3,
            TopLeft = 4,
            TopRight = 5,
            Bottom = 6,
            BottomLeft = 7,
            BottomRight = 8,
        }
    }
}

接下来将ResourceDictionary添加到全局应用程序资源。再次,将BaseResource.xaml替换为您的文件名,如果它不同。

<Application.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="/BaseResource.xaml" />
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</Application.Resources>

将样式添加到目标窗口。

<Window
  ...
  Style="{StaticResource WindowStyle}">

一些事情......

当没有内容时,设计师会对风格感到困惑。这可能是因为我为高度和宽度放置了TemplateBinding,但它在运行时看起来很好,所以我没有进一步搞乱它。我也没有为角落实现调整大小的抓握,但是很容易添加到模板中。

最后,我没有为最小化和最大化按钮绘制图标。我很擅长在Blend中创建Paths。

希望它有所帮助。

答案 3 :(得分:1)

您可以使用WPF Shell Integration Library完全控制窗口的镶边。下载包括一个样本。

PS。一个常见的误解是,您可以通过将WindowStyle设置为None来提供自定义Chrome。虽然这确实删除了默认的chrome,但它有几个缺点,包括你渲染的任何chrome需要处理调整大小/移动,并且你的窗口将在用户的任务栏上最大化,这是不可接受的行为。