【发布时间】:2020-09-22 04:52:14
【问题描述】:
有人知道如何解决这个问题吗?
我没有任何代码可以展示,因为我不知道从哪里开始,这就是我发布这个的原因。
我的计划是在带有隐藏背景图像的 WPF App WrapWindow 上动态加载大约 7000 个单词的字符串数组。文本应该是透明的以暴露后面的图像(类似于标签云)。我已附上示例的链接,这将帮助您可视化问题。
我曾尝试使用 ImageBrush,但它不支持直接内容(即字符串)。我也尝试过使用不透明蒙版,但没有任何成功。
为了给你一个想法,下面是图片和链接到类似的未回答的主题,但我试图达到的效果。
transparent text with opaque background
欢迎任何想法。
谢谢
好的,这就是我目前所拥有的,也是我能够通过单个硬编码字符串实现的。
简单的 xaml,图像作为背景,WrapPanel 由 TEST STRING 以按钮的形式动态填充。
<Grid>
<Image Source="/Images/test.jpg" Stretch="Fill"/>
<WrapPanel x:Name="WrapPan"/>
</Grid>
只是背后代码的草稿。
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
LoadData();
}
string[] test = { "TEST STRING", "TEST STRING", "TEST STRING", "TEST STRING", "TEST STRING",
"TEST STRING", "TEST STRING", "TEST STRING", "TEST STRING", "TEST STRING",
"TEST STRING", "TEST STRING", "TEST STRING", "TEST STRING", "TEST STRING",
"TEST STRING", "TEST STRING", "TEST STRING", "TEST STRING", "TEST STRING",
"TEST STRING", "TEST STRING", "TEST STRING", "TEST STRING", "TEST STRING",
"TEST STRING", "TEST STRING", "TEST STRING", "TEST STRING", "TEST STRING",
"TEST STRING", "TEST STRING", "TEST STRING", "TEST STRING", "TEST STRING",
"TEST STRING", "TEST STRING", "TEST STRING", "TEST STRING", "TEST STRING",
"TEST STRING", "TEST STRING", "TEST STRING", "TEST STRING", "TEST STRING",};
private void LoadData()
{
for (int i = 0; i < test.Length; i++)
{
Button BtnWithName = new Button
{
Style = (Style)FindResource("MaterialDesignFlatButton"),
Content = test[i].ToString(),
Padding = new Thickness(0, 0, 5, 0),
Height = 12,
Command = DialogHost.OpenDialogCommand,
FontSize = 10,
Foreground = Brushes.White,
Opacity = 1,
FontFamily = new FontFamily("Arial Black"),
ToolTip = test[i].ToString(),
};
Button BtnClose = new Button
{
Content = "Close",
Command = DialogHost.CloseDialogCommand,
Width = 100
};
Grid myGrid = new Grid();
myGrid.Height = 200;
myGrid.Width = 200;
RowDefinition gridRow1 = new RowDefinition();
RowDefinition gridRow2 = new RowDefinition();
myGrid.RowDefinitions.Add(gridRow1);
myGrid.RowDefinitions.Add(gridRow2);
TextBlock textBlock = new TextBlock();
textBlock.HorizontalAlignment = HorizontalAlignment.Center;
textBlock.Text = test[i].ToString();
StackPanel sp = new StackPanel();
sp.HorizontalAlignment = HorizontalAlignment.Center;
sp.Children.Add(textBlock);
myGrid.Children.Add(sp);
Grid.SetRow(sp, 0);
myGrid.Children.Add(BtnClose);
Grid.SetRow(BtnClose, 1);
myGrid.VerticalAlignment = VerticalAlignment.Center;
BtnWithName.CommandParameter = myGrid;
WrapPan.Children.Add(BtnWithName);
}
}
}
这给了我下面的输出:
然后,经过一些实验,我资助了将 VisulaBrush 设置为 TextBlock 的图像不透明度蒙版的方法,这给了我想要的效果。 现在的问题仍然是我将如何使用字符串数组动态地执行与上面相同的操作,但效果如下?
<Image Source="/Images/test.jpg" Stretch="Fill">
<Image.Effect>
<BlurEffect Radius="0"/>
</Image.Effect>
<Image.OpacityMask>
<VisualBrush>
<VisualBrush.Visual >
<TextBlock Text="test" />
</VisualBrush.Visual>
</VisualBrush>
</Image.OpacityMask>
</Image>
BrushVisual 只能有一个 Item,所以我将 WrapPanel 放在 MaterialDesign DialogHost 中。我现在可以用我的字符串填充 WrapPanel。我现在遇到的问题是,无论我做什么,我都无法控制按钮上的文本大小,而且当我调整窗口大小时,我放置的按钮越多,图像就会被扭曲和挤压(下图)并拉伸或压缩。
<Image Source="/Images/test.jpg" Stretch="Fill">
<Image.Effect>
<BlurEffect Radius="0"/>
</Image.Effect>
<Image.OpacityMask>
<VisualBrush >
<VisualBrush.Visual>
<materialDesign:DialogHost>
<WrapPanel x:Name="WrapPan"/>
</materialDesign:DialogHost>
</VisualBrush.Visual>
</VisualBrush>
</Image.OpacityMask>
</Image>
【问题讨论】:
-
使用带有 ImageBrush 的 TextBlock 作为前景。
-
Clemens,你能详细说明一下吗?
-
可能的解决方案取决于您的详细要求。您是否需要 only 文本的图像背景,或者真的需要顶部带有较小不透明矩形的背景图像,其中包含文本,这将再次“透明”,就像在 better living ... 示例图片?
-
这个想法是在背景中有一个高分辨率图像,可以在其上加载单词数组/列表,并且背景图像只能通过单词/文本的轮廓可见。
标签: c# wpf xaml opacity opacitymask