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

マージンの 1 つにゼロ以外の値を使用します。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 に答える
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

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>
于 2012-05-14T10:26:13.460 に答える