none
如何让我的自定义窗口具有原生窗口的拖动/靠近边缘时放大的方法呢? RRS feed

  • 问题

  • 你们好,

    我最近遇到个问题,我 WPF 项目上的 Window 是重写了 Template 的,但是我这个 Style 并没有设置 WindowStyle = None,所以它还保留了一些原来窗口的一些功能,如标题栏上的一些功能。

    根据 UI 设计,主窗口上 TabControl 的 TabPanel 跟 Titlebar 重合了,根据鼠标的事件,Titlebar 的优先级比我的 TabPanel 更高,只有鼠标的位置超过了 CaptionHeight ,TabPanel 才能获取鼠标。

    现在我有两个解决方案:

    1:写一个 Titlebar 的 Template,但是我没有找到相关实例

    2:抛弃所有原生窗口,自己写一个窗口,并为标题栏赋予原生窗口的一些功能/事件,但我不知道如何在XAML上做到

    ex:把 TabControl 嵌入到 Window 的 template,很明显,我这种优雅的程序员是不希望这么做的

    新用户无法发图,这个窗口可参考 Chrome

    先谢谢任何回帖和对我有帮助的人。

    2018年12月18日 7:30

答案

  • 你们好,

    我最近遇到个问题,我 WPF 项目上的 Window 是重写了 Template 的,但是我这个 Style 并没有设置 WindowStyle = None,所以它还保留了一些原来窗口的一些功能,如标题栏上的一些功能。

    根据 UI 设计,主窗口上 TabControl 的 TabPanel 跟 Titlebar 重合了,根据鼠标的事件,Titlebar 的优先级比我的 TabPanel 更高,只有鼠标的位置超过了 CaptionHeight ,TabPanel 才能获取鼠标。

    现在我有两个解决方案:

    1:写一个 Titlebar 的 Template,但是我没有找到相关实例

    2:抛弃所有原生窗口,自己写一个窗口,并为标题栏赋予原生窗口的一些功能/事件,但我不知道如何在XAML上做到

    ex:把 TabControl 嵌入到 Window 的 template,很明显,我这种优雅的程序员是不希望这么做的

    新用户无法发图,这个窗口可参考 Chrome

    先谢谢任何回帖和对我有帮助的人。

     

    Hi 啊蓝,

    你可以参考下一些三方的解决方案。

    比如: WPFWindow



    其他的思路,你也可以通过 一些控件的MouseLeftButtonDown事件,设置 this.DragMove() 来让窗体移动。,通过坐标的计算来判断是否达到屏幕的边缘,以便放大。

    下面一个简单的例子,通过TabControl的MouseLeftButtonDown还有每个控件的Panel.ZIndex 来调整布局。 也许对你所有帮助。

    <Grid>
            <Grid.RowDefinitions>
                <RowDefinition Height="30" />
                <RowDefinition />
            </Grid.RowDefinitions>
            <Grid Grid.Row="0" x:Name="PART_Title" Panel.ZIndex="1"  >
                <Grid.Background>
                    <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
                        <GradientStop Color="#FF214F18" Offset="0"/>
                        <GradientStop Color="#FF20361C" Offset="1"/>
                    </LinearGradientBrush>
                </Grid.Background>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition />
                    <ColumnDefinition Width="60" />
                </Grid.ColumnDefinitions>
                <!--<Button x:Name="PART_Close" Content="Close"  Grid.Column="1" Padding="4" />-->
            </Grid>
            <TabControl  Grid.Row="0" Grid.RowSpan="2"  Panel.ZIndex="2" MouseLeftButtonDown="PART_Title_MouseLeftButtonDown">
                <TabItem Header="Home">
                    111
                </TabItem>
                <TabItem Header="Settings">22222</TabItem>
                <TabItem Header="About">3333</TabItem>
            </TabControl>
            <Button x:Name="PART_Close"  Grid.Row="0" Content="Close"  Panel.ZIndex="3" Padding="4" Margin="742,0,0,0" Height="22" Click="PART_Close_Click" VerticalAlignment="Top" />
        </Grid>

    Best Regards,

    Yong Lu


    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    • 已标记为答案 啊蓝 2018年12月19日 7:24
    2018年12月19日 5:48
    版主

全部回复

  • 你们好,

    我最近遇到个问题,我 WPF 项目上的 Window 是重写了 Template 的,但是我这个 Style 并没有设置 WindowStyle = None,所以它还保留了一些原来窗口的一些功能,如标题栏上的一些功能。

    根据 UI 设计,主窗口上 TabControl 的 TabPanel 跟 Titlebar 重合了,根据鼠标的事件,Titlebar 的优先级比我的 TabPanel 更高,只有鼠标的位置超过了 CaptionHeight ,TabPanel 才能获取鼠标。

    现在我有两个解决方案:

    1:写一个 Titlebar 的 Template,但是我没有找到相关实例

    2:抛弃所有原生窗口,自己写一个窗口,并为标题栏赋予原生窗口的一些功能/事件,但我不知道如何在XAML上做到

    ex:把 TabControl 嵌入到 Window 的 template,很明显,我这种优雅的程序员是不希望这么做的

    新用户无法发图,这个窗口可参考 Chrome

    先谢谢任何回帖和对我有帮助的人。

     

    Hi 啊蓝,

    你可以参考下一些三方的解决方案。

    比如: WPFWindow



    其他的思路,你也可以通过 一些控件的MouseLeftButtonDown事件,设置 this.DragMove() 来让窗体移动。,通过坐标的计算来判断是否达到屏幕的边缘,以便放大。

    下面一个简单的例子,通过TabControl的MouseLeftButtonDown还有每个控件的Panel.ZIndex 来调整布局。 也许对你所有帮助。

    <Grid>
            <Grid.RowDefinitions>
                <RowDefinition Height="30" />
                <RowDefinition />
            </Grid.RowDefinitions>
            <Grid Grid.Row="0" x:Name="PART_Title" Panel.ZIndex="1"  >
                <Grid.Background>
                    <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
                        <GradientStop Color="#FF214F18" Offset="0"/>
                        <GradientStop Color="#FF20361C" Offset="1"/>
                    </LinearGradientBrush>
                </Grid.Background>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition />
                    <ColumnDefinition Width="60" />
                </Grid.ColumnDefinitions>
                <!--<Button x:Name="PART_Close" Content="Close"  Grid.Column="1" Padding="4" />-->
            </Grid>
            <TabControl  Grid.Row="0" Grid.RowSpan="2"  Panel.ZIndex="2" MouseLeftButtonDown="PART_Title_MouseLeftButtonDown">
                <TabItem Header="Home">
                    111
                </TabItem>
                <TabItem Header="Settings">22222</TabItem>
                <TabItem Header="About">3333</TabItem>
            </TabControl>
            <Button x:Name="PART_Close"  Grid.Row="0" Content="Close"  Panel.ZIndex="3" Padding="4" Margin="742,0,0,0" Height="22" Click="PART_Close_Click" VerticalAlignment="Top" />
        </Grid>

    Best Regards,

    Yong Lu


    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    • 已标记为答案 啊蓝 2018年12月19日 7:24
    2018年12月19日 5:48
    版主
  • 你的回答给了我一些布局上的思路,谢谢
    2018年12月19日 7:25