次のように、メイン シェル スタイルを windowchrome でオーバーライドするアプリケーションがあります。
XAML:
<Style TargetType="{x:Type local:MainLayoutWindow}">
<Setter Property="shell:WindowChrome.WindowChrome">
<Setter.Value>
<shell:WindowChrome
GlassFrameThickness="0"
ResizeBorderThickness="7"
CaptionHeight="36"
CornerRadius="3"
/>
</Setter.Value>
</Setter>
<Setter Property="WindowState" Value="Maximized" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type local:MainLayoutWindow}">
<Border>
<Border.Style>
<Style TargetType="{x:Type Border}">
<Setter Property="BorderThickness" Value="{Binding WindowResizeBorderThickness}"/>
</Style>
</Border.Style>
<Grid x:Name="Root" >
<Grid>
<!-- Content Border -->
<!-- Header -->
</Grid>
<!-- Buttons -->
<Border BorderBrush="{StaticResource WindowButtonOutline}" BorderThickness="1,0,1,1" CornerRadius="0,0,3,3" VerticalAlignment="Top" Margin="7,1,0,0" HorizontalAlignment="Left">
<StackPanel Orientation="Horizontal">
<Button x:Name="PART_btnClose" Height="17" Width="35" IsTabStop="False" shell:WindowChrome.IsHitTestVisibleInChrome="True" >
</Button>
<Button x:Name="PART_btnMaxAndNormal" Height="17" Width="24" IsTabStop="False" shell:WindowChrome.IsHitTestVisibleInChrome="True" >
</Button>
<Button x:Name="PART_btnMinimize" Height="17" Width="24" IsTabStop="False" shell:WindowChrome.IsHitTestVisibleInChrome="True" >
</Button>
</StackPanel>
</Border>
</Grid>
</Border>
<ControlTemplate.Triggers>
<Trigger Property="WindowState" Value="Maximized">
<Setter Property="shell:WindowChrome.WindowChrome">
<Setter.Value>
<shell:WindowChrome ResizeBorderThickness="0"/>
</Setter.Value>
</Setter>
</Trigger>
<Trigger Property="WindowState" Value="Normal">
<Setter Property="shell:WindowChrome.WindowChrome">
<Setter.Value>
<shell:WindowChrome ResizeBorderThickness="7"/>
</Setter.Value>
</Setter>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
CS:
public MyWindow()
{
this.AllowsTransparency = true;
this.WindowStyle = System.Windows.WindowStyle.None;
this.Caption = "some text";
this.StateChanged += MainLayoutWindow_StateChanged;
}
void MainLayoutWindow_StateChanged(object sender, EventArgs e)
{
if (this._myVM== null) return;
this._myVM.SetState(this.WindowState);
}
public MyWindow(MyVM myVM)
: this()
{
this.DataContext = mainVM;
this._myVM= myVM;
}
Thickness _maximizeThickness = new Thickness(8, 8, 8, 8);
Thickness _normalThickness = new Thickness(0, 0, 0, 0);
Thickness _windowResizeBorderThickness = new Thickness(0, 0, 0, 0);
const string WINDOWRESIZEBORDERTICKNESS = "WindowResizeBorderThickness";
public Thickness WindowResizeBorderThickness
{
get
{
return _windowResizeBorderThickness;
}
set
{
if (_windowResizeBorderThickness != value)
{
_windowResizeBorderThickness = value;
OnPropertyChanged(WINDOWRESIZEBORDERTICKNESS);
}
}
}
public void SetState(WindowState windowState)
{
if (windowState == WindowState.Maximized)
{
WindowResizeBorderThickness = _maximizeThickness;
}
else
{
WindowResizeBorderThickness = _normalThickness;
}
}
問題:
- と を使用しない
AllowsTransparency = true
とWindowStyle=None
、スタイルが読み込まれる前に元のボタンが表示されることがあるようです。または、サーバーに対して長時間かかるアクションがある場合。 - と を設定する
AllowsTransparency = true
とWindowStyle=None
、アプリは画面のすべての幅と高さになります (タスクバーは表示されません)。 - 複数の画面の場合、アプリがプライマリ画面で最大化モードで開いていて、最大化モード ID を使用してセカンダリ画面に移動すると、セカンダリ画面からプライマリ画面に移動できず、最大化モードに移動できません。
何か案は?ありがとう