WindowChrome with AllowsTransparency = true and WindowStyle = No problem

I have an application that overrides the main shell style using windowchrome as shown below:

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;
        }
    }

      

Questions:

  • If I don't use AllowsTransparency = true

    and WindowStyle=None

    it seems that sometimes the original buttons are shown before loading the style. Or, if some action against the server takes a long time.
  • If I set AllowsTransparency = true

    and WindowStyle=None

    , the app gets the full width and height of the screen (no taskbar is displayed).
  • For multiple screens, when the app is open in maximize mode on the main screen, and I switched to the secondary screen with the maximum ID work mode, but I cannot do it from the secondary screen to the main screen, it does not allow moving to maximize the mode.

Any ideas? thank

+3


source to share





All Articles