WindowChrome with AllowsTransparency = true and WindowStyle = None issues

1.1k Views Asked by At

I have an application that i override the main shell style with windowchrome, as follow:

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

Issues:

  1. If I don't using AllowsTransparency = true and WindowStyle=None, it seems that sometimes is see the original buttons before the style is loaded. Or if have any action against the server that takes long time.
  2. If I set AllowsTransparency = true and WindowStyle=None, the app is taken all width and height of screen (the taskbar is not showing).
  3. For multiple screens, when the app is open in maximize mode on the primary screen and I moved to secondary screen with maximize mode id does it but I cannot do it from secondary screen to primary screen, it not allow to move to maximize mode.

Any ideas? thanks

0

There are 0 best solutions below