2

スタイルを WPF Windows に適用する方法はありますか? 例: 最小化、最大化、および X ボタンを変更しますか? グラフィックが WPF ではなく Windows シェルの一部であることはわかっているので、それが可能かどうかはわかりませんでした。

4

4 に答える 4

3
<Window
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
x:Class="AccountOperator.CustomWindowStyle"
x:Name="Window"
Title="CustomWindowStyle"
Width="640" Height="480" WindowStyle="None" Margin="0" BorderThickness="2">

<Window.Resources>

    <Style x:Key="MaxButtonStyle" TargetType="{x:Type Button}">         
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type Button}">
                    <Border  BorderBrush="#535666" BorderThickness="2,5,2,2" Width="20" Height="15" Background="White"/>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
    <Style x:Key="MinButtonStyle" TargetType="{x:Type Button}">

        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type Button}">
                    <Border  Width="20" Height="7"  BorderBrush="#535666" BorderThickness="2" Background="#FFFFFF" HorizontalAlignment="Left" />
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>


    <Style x:Key="CloseButtonStyle" TargetType="{x:Type Button}">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type Button}">
                    <Grid>
                        <Border Width="18" Height="4" BorderThickness="2" BorderBrush="#535666" RenderTransformOrigin="0.5,0.5">
                            <Border.RenderTransform>
                                <TransformGroup>
                                    <ScaleTransform/>
                                    <SkewTransform/>
                                    <RotateTransform Angle="50"/>
                                    <TranslateTransform/>
                                </TransformGroup>
                            </Border.RenderTransform>
                        </Border>
                        <Border Width="18" Height="4" BorderThickness="2" BorderBrush="#535666" RenderTransformOrigin="0.5,0.5">
                            <Border.RenderTransform>
                                <TransformGroup>
                                    <ScaleTransform/>
                                    <SkewTransform/>
                                    <RotateTransform Angle="-50"/>
                                    <TranslateTransform/>
                                </TransformGroup>
                            </Border.RenderTransform>
                        </Border>
                    </Grid>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</Window.Resources>

<Grid x:Name="LayoutRoot">
    <StackPanel  Orientation="Horizontal" VerticalAlignment="Top" HorizontalAlignment="Right">      
        <Button x:Name="BtnMax" Width="20" Height="15" Click="BtnMax_Click" Style="{DynamicResource MaxButtonStyle}" Margin="10"/>
        <Button x:Name="BtnClose" Height="18" Width="20" Margin="10"  Style="{DynamicResource CloseButtonStyle}" Click="BtnClose_Click"/>
        <Button x:Name="BtnMin" Width="20" Height="20" Style="{DynamicResource MinButtonStyle}" Click="BtnMin_Click" Margin="10"/>
    </StackPanel>
</Grid>

public partial class CustomWindowStyle : Window
{
    public CustomWindowStyle()
    {
        this.InitializeComponent();
    }

    private void BtnMax_Click(object sender, System.Windows.RoutedEventArgs e)
    {
        this.WindowState = WindowState.Maximized;
    }

    private void BtnMin_Click(object sender, System.Windows.RoutedEventArgs e)
    {           
        this.WindowState = WindowState.Minimized; 
    }

    private void BtnClose_Click(object sender, System.Windows.RoutedEventArgs e)
    {
        this.Close();
    }       
}

上記のコードをコピーして貼り付けるだけで、必要な結果が得られます。

于 2013-01-22T09:27:59.417 に答える
1

次のプロジェクトを使用してタスクを実行できます: wpfwindow.codeplex.com

このプロジェクトには、これらのボタンのプロパティを変更できるファイル「ButtonIcons.xaml」があります。

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">

  <!-- MINIMIZE -->
  <Border x:Key="WindowButtonMinimizeIcon" Width="12" Height="5" Margin="0,5,0,0" BorderBrush="#535666" BorderThickness="1" Background="#FFFFFF" />

  <!-- MINIMIZE (disabled) -->
  <Border x:Key="WindowButtonMinimizeIconDisabled" Width="12" Height="5" Margin="0,5,0,0" 
          BorderBrush="#9FA5B2" BorderThickness="1" Background="#FFFFFF" />

  <!-- RESTORE -->
  <Canvas x:Key="WindowButtonRestoreIcon">
    <Rectangle Stroke="#535666" Fill="White" Width="10" Height="10" Canvas.Top="1" Canvas.Left="7" />
    <Rectangle Stroke="#535666" Fill="White" Width="4" Height="4" Canvas.Top="4" Canvas.Left="10" />
    <Rectangle Stroke="#535666" Fill="White" Width="10" Height="10" Canvas.Top="3" Canvas.Left="5" />
    <Rectangle Stroke="#535666" Fill="White" Width="4" Height="4" Canvas.Top="6" Canvas.Left="8" />
  </Canvas>

  <!-- RESTORE (disabled) -->
  <Canvas x:Key="WindowButtonRestoreIconDisabled">
    <Rectangle Stroke="#9FA5B2" Fill="White" Width="10" Height="10" Canvas.Top="1" Canvas.Left="7" />
    <Rectangle Stroke="#9FA5B2" Fill="White" Width="4" Height="4" Canvas.Top="4" Canvas.Left="10" />
    <Rectangle Stroke="#9FA5B2" Fill="White" Width="10" Height="10" Canvas.Top="3" Canvas.Left="5" />
    <Rectangle Stroke="#9FA5B2" Fill="White" Width="4" Height="4" Canvas.Top="6" Canvas.Left="8" />
  </Canvas>

  <!-- MAXIMIZE -->
  <Border x:Key="WindowButtonMaximizeIcon" BorderBrush="#535666" BorderThickness="1" Width="12" Height="10">
    <Border BorderBrush="#FCFCFC" BorderThickness="2">
      <Border BorderBrush="#535666" BorderThickness="1" />
    </Border>
  </Border>


  <!-- MAXIMIZE (disabled) -->
  <Border x:Key="WindowButtonMaximizeIconDisabled" BorderBrush="#9FA5B2" BorderThickness="1" Width="12" Height="10">
    <Border BorderBrush="#FCFCFC" BorderThickness="2">
      <Border BorderBrush="#9FA5B2" BorderThickness="1" />
    </Border>
  </Border>

  <!-- CLOSE -->
  <Image Source="/CustomWindow;component/Images/buttonX.png" Width="13" Height="10" x:Key="WindowButtonCloseIcon" />

  <!-- Background colors for red button (e.g close button) -->
  <LinearGradientBrush x:Key="RedButtonBackground" StartPoint="0,0" EndPoint="0,1">
    <GradientStop Offset="0" Color="#F89C8C" />
    <GradientStop Offset="0.45" Color="#D47F75" />
    <GradientStop Offset="0.45" Color="#C04C3C" />
    <GradientStop Offset="1" Color="#C98172" />
  </LinearGradientBrush>

  <LinearGradientBrush x:Key="RedButtonMouseOverBackground" StartPoint="0,0" EndPoint="0,1">
    <GradientStop Offset="0" Color="#F89C8C" />
    <GradientStop Offset="0.45" Color="#E36A53" />
    <GradientStop Offset="0.45" Color="#C72B0E" />
    <GradientStop Offset="0.75" Color="#D44310" />
    <GradientStop Offset="1" Color="#F5E478" />
  </LinearGradientBrush>

</ResourceDictionary>
于 2013-01-21T20:14:55.267 に答える
0

xamlの変更を開始する必要があります。背景などを変更することから始めたいと思うかもしれません。

思ったほど簡単ではありませんでした。最初は、必要なボタンを作成したボタンに変更するだけだと思いました。ここではもう少し複雑になりました。たとえば、ボタンの外観を変えることは、ボタンの背景を変更することほど簡単ではありません。

特定のコントロールテンプレートを作成するか、プロジェクト、イメージにリソースを適用する必要があります。また、XAMLを使用して、イメージの設定を変更するstyleまたはを作成する必要があります。template

私がそれを行った1つの方法は、画像を追加し、その画像に基づいてカスタムコントロールを作成することでした。ボタンやその他のコントロールは必要ありませんでした。次に、のイベントを作成しonclick、マウスオーバー(その他)で、ボタンのように見え、ボタンのように機能する小さな画像を効果的に作成しました。

注目すべき点:

Window.Style Window.Resources Templates

正直なところ、これらの答えを見つける最も簡単な方法は、Googleに尋ねることです。何でも質問できますが、最後にWPFを追加してください。そうすれば、WPF固有のコーディングに対する答えしか見つかりません。多くの人は異なる動作をしますが、すばらしいxamlの例がたくさん見つかります。

于 2013-01-21T20:27:52.870 に答える
0

はい、ウィンドウのスタイルを自由に設定できます。
残念なことに、タイトル バー、システム ボタン、ウィンドウの透過性、または形状のスタイルを設定する場合、多くの場合、すべてかゼロかの問題です。

最初に設定してから、Window.WindowStyle = WindowStyle.None
新しいwpfスタイルを作成できますContolTemplate
おそらく、ウィンドウのドラッグ、タイトル バーのダブルクリック、サイズ変更などを処理するコードを記述する必要があります。

于 2013-01-21T20:10:17.467 に答える