none
谁知道这种非毛玻璃透明效果怎么做,就是win7拖动一个窗口靠边时弹出的窗口效果? RRS feed

答案

  • 微软没有公开API可以直接做到全透明的玻璃效果,我们能做到的只有模糊背景的玻璃效果。

    不过,通过我们自己用Brush去绘制一个玻璃效果,也是可以做到类似的:

    <Window x:Class="WpfApplication5.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:shell="http://schemas.microsoft.com/winfx/2006/xaml/presentation/shell"
            xmlns:theme="clr-namespace:Microsoft.Windows.Themes;assembly=PresentationFramework.Aero"
            Title="MainWindow" Height="350" Width="525" Background="Transparent"
            AllowsTransparency="True" WindowStyle="None">
      <shell:WindowChrome.WindowChrome>
        <shell:WindowChrome CaptionHeight="20" CornerRadius="5" ResizeBorderThickness="5"/>
      </shell:WindowChrome.WindowChrome>
      <Grid>
        <Grid.RowDefinitions>
          <RowDefinition Height="30"/>
          <RowDefinition Height="*"/>
        </Grid.RowDefinitions>
        <Border x:Name="Caption" Background="White" CornerRadius="5" />
        <Border BorderThickness="5" CornerRadius="5" Grid.RowSpan="2" BorderBrush="White">
          <Border.Background>
            <DrawingBrush Viewbox="0 0 1 1" Viewport="0 0 .1 0.7" TileMode="Tile">
              <DrawingBrush.Transform>
                <RotateTransform Angle="45"/>
              </DrawingBrush.Transform>
              <DrawingBrush.Drawing>
                <GeometryDrawing>
                  <GeometryDrawing.Geometry>
                    <RectangleGeometry Rect="0 0 1 1"/>
                  </GeometryDrawing.Geometry>
                  <GeometryDrawing.Brush>
                    <LinearGradientBrush StartPoint="1,0" EndPoint="1,1">
                      <!-- This gradient stop is Fully transparent. -->
                      <GradientStop Color="#00FFFFFF" Offset="0.0" />
                      <!-- This gradient stop is fully opaque. -->
                      <GradientStop Color="#66FFffff" Offset="0.4" />
                      <GradientStop Color="#66FFffff" Offset="0.5" />
                      <GradientStop Color="#00FFFFFF" Offset="1" />
                    </LinearGradientBrush>
                  </GeometryDrawing.Brush>
                </GeometryDrawing>
              </DrawingBrush.Drawing>
            </DrawingBrush>
          </Border.Background>
        </Border>
      </Grid>
    </Window>
    

    这个shell库可以从这里下载到:http://archive.msdn.microsoft.com/WPFShell

    预览效果:

    完整的例子下载:https://skydrive.live.com/?cid=51b2fdd068799d15#cid=51B2FDD068799D15&id=51B2FDD068799D15%21967


    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us

    • 已标记为答案 Touch.S 2012年5月23日 8:01
    2012年5月18日 5:04
    版主

全部回复

  • 微软没有公开API可以直接做到全透明的玻璃效果,我们能做到的只有模糊背景的玻璃效果。

    不过,通过我们自己用Brush去绘制一个玻璃效果,也是可以做到类似的:

    <Window x:Class="WpfApplication5.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:shell="http://schemas.microsoft.com/winfx/2006/xaml/presentation/shell"
            xmlns:theme="clr-namespace:Microsoft.Windows.Themes;assembly=PresentationFramework.Aero"
            Title="MainWindow" Height="350" Width="525" Background="Transparent"
            AllowsTransparency="True" WindowStyle="None">
      <shell:WindowChrome.WindowChrome>
        <shell:WindowChrome CaptionHeight="20" CornerRadius="5" ResizeBorderThickness="5"/>
      </shell:WindowChrome.WindowChrome>
      <Grid>
        <Grid.RowDefinitions>
          <RowDefinition Height="30"/>
          <RowDefinition Height="*"/>
        </Grid.RowDefinitions>
        <Border x:Name="Caption" Background="White" CornerRadius="5" />
        <Border BorderThickness="5" CornerRadius="5" Grid.RowSpan="2" BorderBrush="White">
          <Border.Background>
            <DrawingBrush Viewbox="0 0 1 1" Viewport="0 0 .1 0.7" TileMode="Tile">
              <DrawingBrush.Transform>
                <RotateTransform Angle="45"/>
              </DrawingBrush.Transform>
              <DrawingBrush.Drawing>
                <GeometryDrawing>
                  <GeometryDrawing.Geometry>
                    <RectangleGeometry Rect="0 0 1 1"/>
                  </GeometryDrawing.Geometry>
                  <GeometryDrawing.Brush>
                    <LinearGradientBrush StartPoint="1,0" EndPoint="1,1">
                      <!-- This gradient stop is Fully transparent. -->
                      <GradientStop Color="#00FFFFFF" Offset="0.0" />
                      <!-- This gradient stop is fully opaque. -->
                      <GradientStop Color="#66FFffff" Offset="0.4" />
                      <GradientStop Color="#66FFffff" Offset="0.5" />
                      <GradientStop Color="#00FFFFFF" Offset="1" />
                    </LinearGradientBrush>
                  </GeometryDrawing.Brush>
                </GeometryDrawing>
              </DrawingBrush.Drawing>
            </DrawingBrush>
          </Border.Background>
        </Border>
      </Grid>
    </Window>
    

    这个shell库可以从这里下载到:http://archive.msdn.microsoft.com/WPFShell

    预览效果:

    完整的例子下载:https://skydrive.live.com/?cid=51b2fdd068799d15#cid=51B2FDD068799D15&id=51B2FDD068799D15%21967


    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us

    • 已标记为答案 Touch.S 2012年5月23日 8:01
    2012年5月18日 5:04
    版主
  •     <shell:WindowChrome.WindowChrome>
            <shell:WindowChrome CaptionHeight="20" CornerRadius="5" ResizeBorderThickness="5"/>
        </shell:WindowChrome.WindowChrome>

    这个需要导入什么么?

    2012年5月18日 5:55
  •     <shell:WindowChrome.WindowChrome>
            <shell:WindowChrome CaptionHeight="20" CornerRadius="5" ResizeBorderThickness="5"/>
        </shell:WindowChrome.WindowChrome>

    这个需要导入什么么?

    导入 这个WPF shell库 http://archive.msdn.microsoft.com/WPFShell

    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us

    2012年5月18日 6:31
    版主
  • 微软没有公开API可以直接做到全透明的玻璃效果,我们能做到的只有模糊背景的玻璃效果。

    不过,通过我们自己用Brush去绘制一个玻璃效果,也是可以做到类似的:

    <Window x:Class="WpfApplication5.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:shell="http://schemas.microsoft.com/winfx/2006/xaml/presentation/shell"
            xmlns:theme="clr-namespace:Microsoft.Windows.Themes;assembly=PresentationFramework.Aero"
            Title="MainWindow" Height="350" Width="525" Background="Transparent"
            AllowsTransparency="True" WindowStyle="None">
      <shell:WindowChrome.WindowChrome>
        <shell:WindowChrome CaptionHeight="20" CornerRadius="5" ResizeBorderThickness="5"/>
      </shell:WindowChrome.WindowChrome>
      <Grid>
        <Grid.RowDefinitions>
          <RowDefinition Height="30"/>
          <RowDefinition Height="*"/>
        </Grid.RowDefinitions>
        <Border x:Name="Caption" Background="White" CornerRadius="5" />
        <Border BorderThickness="5" CornerRadius="5" Grid.RowSpan="2" BorderBrush="White">
          <Border.Background>
            <DrawingBrush Viewbox="0 0 1 1" Viewport="0 0 .1 0.7" TileMode="Tile">
              <DrawingBrush.Transform>
                <RotateTransform Angle="45"/>
              </DrawingBrush.Transform>
              <DrawingBrush.Drawing>
                <GeometryDrawing>
                  <GeometryDrawing.Geometry>
                    <RectangleGeometry Rect="0 0 1 1"/>
                  </GeometryDrawing.Geometry>
                  <GeometryDrawing.Brush>
                    <LinearGradientBrush StartPoint="1,0" EndPoint="1,1">
                      <!-- This gradient stop is Fully transparent. -->
                      <GradientStop Color="#00FFFFFF" Offset="0.0" />
                      <!-- This gradient stop is fully opaque. -->
                      <GradientStop Color="#66FFffff" Offset="0.4" />
                      <GradientStop Color="#66FFffff" Offset="0.5" />
                      <GradientStop Color="#00FFFFFF" Offset="1" />
                    </LinearGradientBrush>
                  </GeometryDrawing.Brush>
                </GeometryDrawing>
              </DrawingBrush.Drawing>
            </DrawingBrush>
          </Border.Background>
        </Border>
      </Grid>
    </Window>
    

    这个shell库可以从这里下载到:http://archive.msdn.microsoft.com/WPFShell

    预览效果:

    完整的例子下载:https://skydrive.live.com/?cid=51b2fdd068799d15#cid=51B2FDD068799D15&id=51B2FDD068799D15%21967


    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us

    这个demo很有借鉴意义!我本身解除wpf并不久,我想问下就是以前winform的时候我可以this.panel1.Handler来获得panel1的Handler,而在WPF我要怎么获得控件的Handler?
    2012年5月23日 8:13
  • WPF控件没有Handler, 因为他们都是DX 绘制的,不是一个个独立的window. 你所能获得的只是WPF窗体外面操作系统用来包装的那个包装体的Handler:

    在窗体显示后,即Loaded事件中,可以拿到这个window wrapper的handler:

    IntPtr windowHandle = new WindowInteropHelper(this).Handle;


    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us

    2012年5月23日 9:16
    版主
  • WPF控件没有Handler, 因为他们都是DX 绘制的,不是一个个独立的window. 你所能获得的只是WPF窗体外面操作系统用来包装的那个包装体的Handler:

    在窗体显示后,即Loaded事件中,可以拿到这个window wrapper的handler:

    IntPtr windowHandle = new WindowInteropHelper(this).Handle;


    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us

    我查了下资料,确实如你所说,这也是个优点吧,看来这思路要转变过来,BOB Bao多谢了
    2012年5月24日 11:44