0

我正在尝试在 WPF 中创建一个无边框窗口。我正在使用链接中提到的课程。

只要所有元素都启用(不透明度= 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; 
    } 
} 

}

4

3 回答 3

0

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

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

  <DropShadowEffect ShadowDepth="2"></DropShadowEffect>
于 2012-05-14T10:26:13.460 回答
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>
于 2012-05-24T16:07:05.190 回答
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;
    }
于 2013-12-02T17:40:34.117 回答