3

我有一个应用程序,我用 windowchrome 覆盖了主 shell 样式,如下所示:

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 = trueand WindowStyle=None,似乎有时会在加载样式之前看到原始按钮。或者,如果对服务器采取任何需要很长时间的操作。
  2. 如果我设置AllowsTransparency = trueand WindowStyle=None,则应用程序会占用屏幕的所有宽度和高度(任务栏未显示)。
  3. 对于多个屏幕,当应用程序在主屏幕上以最大化模式打开并且我移动到具有最大化模式 id 的辅助屏幕时,但我不能从辅助屏幕到主屏幕,它不允许移动到最大化模式。

有任何想法吗?谢谢

4

0 回答 0