2012-05-14 60 views
0

我想在WPF中创建无边框窗口。我正在使用link中提到的类。无边界窗口投影不透明元素问题

只要所有元素全部启用(不透明度= 1),此工作正常。如果我将不透明度设置为0.5,则几乎看不见。

如果我删除阴影的代码,不透明度可以正常工作。我不确定这是什么原因。

该课程与我上面使用的课程相同。我的代码的其余部分如下。

任何帮助表示赞赏:

  • 吉里贾·

XAML:背后

<Window x:Class="Sample.Window1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:local="clr-namespace:Sample"> 
<Grid> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="70"/> 
     <RowDefinition Height="*"/> 
    </Grid.RowDefinitions> 
    <TextBox Margin="2" Text="Something" Grid.Row="0"/> 
    <Button Grid.Row="1" Content="Something" IsEnabled="False" Opacity="0.7"/> 
</Grid> 

代码:

/// <summary> 
/// Interaction logic for Window1.xaml 
/// </summary> 
public partial class Window1 : Window 
{ 

    public Window1() 
    { 
     InitializeComponent(); 

    } 

    /// <summary> 
    /// Raises the <see cref="E:System.Windows.FrameworkElement.Initialized"/> event. 
    /// This method is invoked whenever 
    /// <see cref="P:System.Windows.FrameworkElement.IsInitialized"/> is set to true internally. 
    /// </summary> 
    /// <param name="e">The <see cref="T:System.Windows.RoutedEventArgs"/> 
    /// that contains the event data.</param> 
    protected override void OnInitialized(EventArgs e) 
    { 
     //AllowsTransparency = false; 
     ResizeMode = ResizeMode.NoResize; 

     WindowStartupLocation = WindowStartupLocation.CenterScreen; 
     WindowStyle = WindowStyle.None; 

     DwmDropShadow.DropShadowToWindow(this); 

     base.OnInitialized(e); 
    } 
} 
从上面的链接采取

帮助类:

class DwmDropShadow 

{

[DllImport("dwmapi.dll", PreserveSig = true)] 
private static extern int DwmSetWindowAttribute(IntPtr hwnd, int attr, ref int attrValue, int attrSize); 

[DllImport("dwmapi.dll")] 
private static extern int DwmExtendFrameIntoClientArea(IntPtr hWnd, ref Margins pMarInset); 

/// <summary> 
/// Drops a standard shadow to a WPF Window, even if the window isborderless. Only works with DWM (Vista and Seven). 
/// This method is much more efficient than setting AllowsTransparency to true and using the DropShadow effect, 
/// as AllowsTransparency involves a huge permormance issue (hardware acceleration is turned off for all the window). 
/// </summary> 
/// <param name="window">Window to which the shadow will be applied</param> 
public static void DropShadowToWindow(Window window) 
{ 
    if (!DropShadow(window)) 
    { 
     window.SourceInitialized += new EventHandler(window_SourceInitialized); 
    } 
} 

private static void window_SourceInitialized(object sender, EventArgs e) 
{ 
    Window window = (Window)sender; 

    DropShadow(window); 

    window.SourceInitialized -= new EventHandler(window_SourceInitialized); 
} 

/// <summary> 
/// The actual method that makes API calls to drop the shadow to the window 
/// </summary> 
/// <param name="window">Window to which the shadow will be applied</param> 
/// <returns>True if the method succeeded, false if not</returns> 
private static bool DropShadow(Window window) 
{ 
    try 
    { 
     WindowInteropHelper helper = new WindowInteropHelper(window); 
     int val = 2; 
     int ret1 = DwmSetWindowAttribute(helper.Handle, 2, ref val, 4); 

     if (ret1 == 0) 
     { 
      Margins m = new Margins { Bottom = 0, Left = 0, Right = 0, Top = 0 }; 
      int ret2 = DwmExtendFrameIntoClientArea(helper.Handle, ref m); 
      return ret2 == 0; 
     } 
     else 
     { 
      return false; 
     } 
    } 
    catch (Exception ex) 
    { 
     // Probably dwmapi.dll not found (incompatible OS) 
     return false; 
    } 
} 

}

回答

0

我不知道你为什么要使用通过使用dwmapi.dll文件阴影效果。为什么不使用WPF扩展工具包或presentationframework.Aero(Visual Studio中的.NET程序集引用)中的硬件加速阴影效果?

<ResourceDictionary Source="/presentationframework.Aero;V3.0.0.0;31bf3856ad364e35;component/themes/aero.normalcolor.xaml"/> 

    <DropShadowEffect ShadowDepth="2"></DropShadowEffect> 
0

在这里你去:)

<Window x:Class="Test.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    AllowsTransparency="True" 
    Title="MainWindow" 
    Background="Transparent" 
    WindowStyle="None" 
    Height="350" 
    Width="500"> 
    <Border Background="#ffFEFEFE" CornerRadius="5" BorderThickness="2" Margin="10" BorderBrush="#ffaaaaaa"> 
    <Border.Effect> 
     <DropShadowEffect Direction="270" 
          ShadowDepth="5" 
          Opacity="0.8" 
          BlurRadius="7" /> 
    </Border.Effect> 
    <Grid> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="70" /> 
      <RowDefinition Height="*" /> 
     </Grid.RowDefinitions> 

     <TextBox Margin="2" 
       Text="Something" 
       Grid.Row="0" /> 
     <Button Grid.Row="1" 
       Content="Something" 
       IsEnabled="False" 
       Opacity="0.5" /> 

    </Grid> 

    </Border> 
</Window> 
0

使用非零值的利润率之一,例如。 1,0,0,0;或者1,1,1,1;并使用您自己的边距:

[StructLayout(LayoutKind.Sequential)] 
    public struct Margins 
    { 
     public int Left; 
     public int Right; 
     public int Top; 
     public int Bottom; 
    }