3

次のように、メイン シェル スタイルを 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;
        }
    }

問題:

  1. と を使用しないAllowsTransparency = trueWindowStyle=None、スタイルが読み込まれる前に元のボタンが表示されることがあるようです。または、サーバーに対して長時間かかるアクションがある場合。
  2. と を設定するAllowsTransparency = trueWindowStyle=None、アプリは画面のすべての幅と高さになります (タスクバーは表示されません)。
  3. 複数の画面の場合、アプリがプライマリ画面で最大化モードで開いていて、最大化モード ID を使用してセカンダリ画面に移動すると、セカンダリ画面からプライマリ画面に移動できず、最大化モードに移動できません。

何か案は?ありがとう

4

0 に答える 0