【问题标题】:Creating a custom Stackpanel with Transparent "Windows"使用透明的“Windows”创建自定义 Stackpanel
【发布时间】:2012-05-17 04:55:25
【问题描述】:

晚上好。我已经研究了我的问题大约两天了,并且已经尝试了至少十几个问题的变体。每一个最后一个都是完全失败的,所以我不会在这里发布任何代码。

我需要的是用于无边框窗口的 StackPanel。 StackPanel 需要有一个不透明的背景,而孩子们需要有一个透明的背景。我需要透明度来一直通过子元素、StackPanel 和底层主窗口。

有没有人知道如何做这件事,我应该从哪里开始?我是一名中级程序员,在这里碰了壁。我试图从 Panel Class 继承,超越通常的嫌疑人; MeasureOverride、ArangeOveride、OnRender 等。

我也有一个想法,是在父节点和所有子节点之间使用某种形式的 CombinedGeometry。

提前致谢!!

【问题讨论】:

  • 当您说“StackPanel 需要具有不透明背景”时,我不太明白您的意思。您不想通过完整的元素树获得完全的透明度吗?或者换句话说,如果您有带有一些文本的 TextBlock,您会在桌面(当然还有其他窗口)上看到该文本而没有其他内容?
  • 好的,这就是交易。我正在创建一个白板应用程序(出于必要)。我在堆栈面板中有一些项目。顶部是菜单。底部是带有控件的调色板。中间是一块“白板”。白板必须对底层应用程序(主要是 PDF)具有完全的透明度。我需要包含要填充的控件的电路板周围的区域,而不是透明的。这更有意义吗?
  • 我还是不明白问题出在哪里。除非您明确设置其背景属性,否则 StackPanel 或任何其他面板已经是透明的。没问题。您还可以将此面板覆盖在任何其他(PDF 查看器?)控件之上。也没有问题。对于白板项目,它们是什么?例如,路径也是透明的,除非它有一个封闭的几何图形并且您设置了它的 Fill 属性。还是没问题。

标签: wpf c#-4.0 wpf-controls


【解决方案1】:

您可能缺少的是Window.AllowsTransparency="True"。遗憾的是,您必须构建自己的窗口标题和边框,因为WindowStyle 属性必须设置为None

我已经为你创建了一个示例:

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        AllowsTransparency="True"
        Background="Transparent"
        WindowStyle="None"
        WindowStartupLocation="CenterScreen">
    <Border BorderBrush="Black" BorderThickness="1">        
        <DockPanel>
            <Menu DockPanel.Dock="Top">
                <MenuItem Header="Application">
                    <MenuItem Header="_Close" Click="MenuItem_Click"/>
                </MenuItem>
            </Menu>
            <ToolBar DockPanel.Dock="Bottom">
                <Button>sample button</Button>
            </ToolBar>
            <StackPanel>
                ... your whiteboard ...
            </StackPanel>
        </DockPanel>
    </Border>
</Window>

.

private void MenuItem_Click(object sender, RoutedEventArgs e)
{
    this.Close();
}

【讨论】:

  • 好的,所以在我把自己变成一个完整而彻底的白痴之前,也许我需要得到一点“图形”。这是我放在一起的应用程序图片的链接。 (studiocc.elementfx.com) 我需要一个面板来将整个混乱放入其中,该面板将具有黑色背景,同时仍允许白板是透明的。如果我现在设置包含所有内容的堆栈面板,则底层应用程序将被屏蔽。
  • 我在我的网站上发布了另一张照片。 (studiocc.elementfx.com) 最后一个建议无效。我开始怀疑我所追求的是否可能。如您所见,我失去了董事会的透明度​​。我现在按照我的意愿装满了我的容器,但没有透明度。还有其他想法吗?谢谢!!抄送
  • 您是如何失去透明度的?您有几个图层(在我的示例窗口中,边框,停靠面板,堆栈面板)。如果一层不透明,则看不到下面的内容。
【解决方案2】:

好吧,经过很多、很多、几个小时的蛮力“黑客攻击”,我终于找到了一种方法来完成我需要的事情。

<Border Name="OuterBorder" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" BorderBrush="Orange" BorderThickness="1.5">
    <Border Name="FillerStrip" BorderBrush="Black" BorderThickness="20">
        <Border Name="InnerBorder" BorderBrush="Orange" BorderThickness="1.5">
            <StackPanel HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Background="Transparent">
                <local:GlassBoardControl BorderBrush="Orange"            BorderThickness="2" AxisBrush="LawnGreen" AxisThickness="15" x:Name="screen" />

            </StackPanel>
        </Border>    
    </Border>
</Border>

现在我唯一的问题是,我到底该如何创建一个自定义面板,并将其作为边框?任何关于我应该从哪里开始的想法将不胜感激。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-07
    • 2011-05-24
    • 1970-01-01
    • 2016-07-25
    • 1970-01-01
    相关资源
    最近更新 更多