WPF Net Framework 3.5 Window Metro Style

感情迁移 提交于 2019-12-11 06:36:44

问题


I want to make Window with Metro style.


I found the 3 following libraries:

http://elysium.asvishnyakov.com/en/

https://github.com/MahApps/MahApps.Metro

http://mui.codeplex.com/

All are for Net Framework 4+.
Is there anything for 3.5?

I also tried to make it on my own (Didnt finish - still need to design it and add Resize [which I dont know how]) but I dont really like how it's made...:

<Window
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:xctk="http://schemas.xceed.com/wpf/xaml/toolkit" x:Class="Windows_Hider.MainWindow"
        Title="Windows Hider" Height="350" Width="525" WindowStartupLocation="CenterScreen" 
        AllowsTransparency="True"
    ResizeMode="CanResize" WindowStyle="None" BorderBrush="Black" BorderThickness="1" Icon="windowshider.ico">
    <Grid>
        <Grid>
            <Grid.RowDefinitions>
                <RowDefinition Height="Auto"/>
                <RowDefinition Height="*"/>
            </Grid.RowDefinitions>
            <StackPanel Orientation="Horizontal" HorizontalAlignment="Left" VerticalAlignment="Top">
                <Image Width="24" Height="24" Source="{Binding Icon, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}}"/>
                <Label VerticalAlignment="Center" FontSize="14" Content="{Binding Title, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}}"/>
            </StackPanel>
            <Grid MouseDown="Grid_MouseDown" Background="Transparent"/>
            <StackPanel Orientation="Horizontal" HorizontalAlignment="Right" VerticalAlignment="Top" Grid.Row="0">
                <Button ToolTip="minimize" Background="White">
                    <Grid Width="30" Height="25">
                        <TextBlock Text="0" FontFamily="Marlett" FontSize="14" VerticalAlignment="Center" HorizontalAlignment="Center" Padding="3.5,0,0,3" />
                    </Grid>
                </Button>
                <Grid Margin="1,0,1,0">
                    <Button x:Name="Restore"  ToolTip="restore" Visibility="Collapsed">
                        <Grid Width="30" Height="25" UseLayoutRounding="True">
                            <TextBlock Text="2" FontFamily="Marlett" FontSize="14" VerticalAlignment="Center" HorizontalAlignment="Center" Padding="2,0,0,1" />
                        </Grid>
                    </Button>
                    <Button x:Name="Maximize" ToolTip="maximize">
                        <Grid Width="31" Height="25">
                            <TextBlock Text="1" FontFamily="Marlett" FontSize="14" VerticalAlignment="Center" HorizontalAlignment="Center" Padding="2,0,0,1" />
                        </Grid>
                    </Button>
                </Grid>
                <Button  x:Name="Close" ToolTip="close">
                    <Grid Width="30" Height="25">
                        <TextBlock Text="r" FontFamily="Marlett" FontSize="14" VerticalAlignment="Center" HorizontalAlignment="Center" Padding="0,0,0,1" />
                    </Grid>
                </Button>
            </StackPanel>
        </Grid>
    </Grid>
</Window>

回答1:


Ok, it took me few days but in the end I managed to do something.

I had to make it by myself because there's no Metro Window for Net Framework 3.5.

I combined some of the references below:

Launch window's System Menu on custom window

http://www.codeproject.com/Articles/107994/Taskbar-with-Window-Maximized-and-WindowState-to-N

http://blog.magnusmontin.net/2013/03/16/how-to-create-a-custom-window-in-wpf/

http://codekong.wordpress.com/2010/11/10/custom-window-style-and-accounting-for-the-taskbar/

http://blog.creativeitp.com/posts-and-articles/c-sharp/simple-methods-to-drag-and-resize-your-c-transparent-wpf-application-with-the-windowstyle-property-set-to-none/



this is the final solution

Known problems / bugs:
1. When resizing the arrow cursor appear instead of the resizing cursor.
2. Designer cant display the custom window.
3. When maximizing, randomly there's blue (the color of the borders) in big area of the screen - for split second

If you can fix any of the problems above it will be even better but I am satisfied with what I achieved.

EDIT:
Updated to allow resize modes (also added sample)




回答2:


It's relatively easy to do this yourself... all you need to do is copy the Style that you see in the Metro UI, as you call it. To start you off, here is a very simple Style that changes the ControlTemplate of the Button elements to remove their default look:

<Style TargetType="Button">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="Button">
                <Grid>
                    <ContentPresenter HorizontalAlignment="Center" 
                        VerticalAlignment="Center" />
                </Grid>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

Of course, you'll want something to happen when the user moves their mouse pointer over the Button and you can do that by adding VisualStateManager.VisualStateGroups to the ControlTemplate. You can find a full example of this in the ControlTemplate Class page on MSDN.

The other controls Metro-style controls can be easily developed by creating simple ControlTemplates in the same way. Basically, you'll just need to remove the default WPF look and for the most part, just replace it with just a ContentPresenter as in the above example, or an ItemsPresenter for collection controls. Luckily the Metro look is very plain and simple, just remember to keep everything spaced out and plain.

To address another point you mad about resizing; you can set the Window.ResizeMode property to CanResizeWithGrip to add the resize grip in the bottom right corner of the Window as is often seen in these applications.



来源:https://stackoverflow.com/questions/19335343/wpf-net-framework-3-5-window-metro-style

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!