- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在 WPF 中,大多数控件都有一个 Effect
属性,例如 Grid.Effect
,它允许创建模糊网格。我想了解如何在 WinRT 中创建背景模糊的弹出窗口?
最佳答案
不执行此操作或使用 DirectX 的替代方法可能是使用新的 RenderTargetBitmap
类以及 RenderAsync()
方法,该方法允许您访问从 C# 或 VB 级别进行控制(假设您正在使用该级别),这可能比 DirectX 更容易,而且实际上速度足够快,足以让一些基本效果在 CPU 上运行。我已经在 FxContentControl
中完成了上周末在 WinRT XAML 工具包中,它似乎在一些简单的场景中工作正常,主要问题是 - 何时更新效果。
该控件目前不会模糊任何内容,而是找到内容的扩展像素并将其设为黑色,作为为 TextBlock
或任何其他控件生成笔划的穷人的方式有一些透明区域和一些不透明区域。您可以将其更改为模糊或添加一个选项以相当轻松地按需执行此操作。
这是模板化控件的默认样式:
<Style
TargetType="controls:FxContentControl">
<Setter
Property="HorizontalContentAlignment"
Value="Left" />
<Setter
Property="VerticalContentAlignment"
Value="Top" />
<Setter
Property="Template">
<Setter.Value>
<ControlTemplate
TargetType="controls:FxContentControl">
<Grid>
<Image
x:Name="BackgroundFxImage"
Stretch="None"
HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
Margin="{TemplateBinding Padding}"
VerticalAlignment="{TemplateBinding VerticalContentAlignment}" />
<Grid
x:Name="RenderedGrid"
HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
Margin="{TemplateBinding Padding}"
VerticalAlignment="{TemplateBinding VerticalContentAlignment}">
<ContentPresenter
x:Name="ContentPresenter"
ContentTemplate="{TemplateBinding ContentTemplate}"
ContentTransitions="{TemplateBinding ContentTransitions}"
Content="{TemplateBinding Content}" />
</Grid>
<Image
x:Name="ForegroundFxImage"
Stretch="None"
HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
Margin="{TemplateBinding Padding}"
VerticalAlignment="{TemplateBinding VerticalContentAlignment}" />
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
代码如下:
using System;
using System.Threading.Tasks;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Media.Imaging;
using WinRTXamlToolkit.Imaging;
namespace WinRTXamlToolkit.Controls
{
public class FxContentControl : ContentControl
{
private Image _backgroundFxImage;
private Image _foregroundFxImage;
private ContentPresenter _contentPresenter;
private Grid _renderedGrid;
public FxContentControl()
{
this.DefaultStyleKey = typeof(FxContentControl);
}
protected override async void OnApplyTemplate()
{
base.OnApplyTemplate();
_backgroundFxImage = this.GetTemplateChild("BackgroundFxImage") as Image;
_foregroundFxImage = this.GetTemplateChild("ForegroundFxImage") as Image;
_contentPresenter = this.GetTemplateChild("ContentPresenter") as ContentPresenter;
_renderedGrid = this.GetTemplateChild("RenderedGrid") as Grid;
if (_renderedGrid != null)
{
_renderedGrid.SizeChanged += this.OnContentPresenterSizeChanged;
}
if (_renderedGrid.ActualHeight > 0)
{
await this.UpdateFx();
}
}
private async void OnContentPresenterSizeChanged(object sender, SizeChangedEventArgs sizeChangedEventArgs)
{
await this.UpdateFx();
}
private async Task UpdateFx()
{
await this.UpdateBackgroundFx();
}
private async Task UpdateBackgroundFx()
{
if (_renderedGrid.ActualHeight < 1 ||
_backgroundFxImage == null)
{
return;
}
var rtb = new RenderTargetBitmap();
await rtb.RenderAsync(_renderedGrid);
var pw = rtb.PixelWidth;
var ph = rtb.PixelHeight;
var wb = _backgroundFxImage.Source as WriteableBitmap;
if (wb == null ||
wb.PixelWidth != pw ||
wb.PixelHeight != ph)
{
wb = new WriteableBitmap(pw, ph);
}
await ProcessContentImage(rtb, wb, pw, ph);
_backgroundFxImage.Source = wb;
}
protected virtual async Task ProcessContentImage(RenderTargetBitmap rtb, WriteableBitmap wb, int pw, int ph)
{
var rtbBuffer = await rtb.GetPixelsAsync();
var rtbPixels = rtbBuffer.GetPixels();
var wbBuffer = wb.PixelBuffer;
var wbPixels = wbBuffer.GetPixels();
// Expand
int expansion = 1;
for (int x = 0; x < pw; x++)
for (int y = 0; y < ph; y++)
{
int x1min = Math.Max(0, x - expansion);
int x1max = Math.Min(x + expansion, pw - 1);
int y1min = Math.Max(0, y - expansion);
int y1max = Math.Min(y + expansion, ph - 1);
//bool found = false;
byte maxa = 0;
for (int x1 = x1min; x1 <= x1max; x1++)
for (int y1 = y1min; y1 <= y1max; y1++)
{
var a = rtbPixels.Bytes[4 * (y1 * pw + x1) + 3];
if (a > maxa)
maxa = a;
}
wbPixels.Bytes[4 * (y * pw + x)] = 0;
wbPixels.Bytes[4 * (y * pw + x) + 1] = 0;
wbPixels.Bytes[4 * (y * pw + x) + 2] = 0;
wbPixels.Bytes[4 * (y * pw + x) + 3] = maxa;
}
wbPixels.UpdateFromBytes();
}
}
}
它还使用以下 IBuffer 包装器:
using System;
using System.IO;
using System.Runtime.InteropServices.WindowsRuntime;
using Windows.Storage.Streams;
namespace WinRTXamlToolkit.Imaging
{
// ReSharper disable InconsistentNaming - This class extends IBuffer
/// <summary>
/// Contains extensions for an IBuffer interface in the context of a WriteableBitmap,
/// which exposes one to access its pixels.
/// </summary>
public static class IBufferExtensions
// ReSharper restore InconsistentNaming
{
/// <summary>
/// Gives access to the pixels of a WriteableBitmap given an IBuffer
/// exposed by Pixels property.
/// </summary>
/// <remarks>
/// Note that creating this object copies the pixels buffer
/// into the Bytes byte array for quick pixel access
/// and the array needs to be copied back to the pixels buffer
/// to update the bitmap with a call to UpdateFromBytes().
/// This is acceptable for convenience and possibly best for
/// performance in some scenarios, but it does add some upfront
/// overhead as well overhead to update the bitmap at the end.
/// This is only a theory and for better performance it might be
/// good to test different approaches.
/// The goal of this approach is code simplicity. For best performance
/// using native code and/or DirectX is recommended.
/// </remarks>
public class PixelBufferInfo
{
private readonly Stream _pixelStream;
/// <summary>
/// The bytes of the pixel stream.
/// </summary>
public byte[] Bytes;
/// <summary>
/// Initializes a new instance of the <see cref="PixelBufferInfo" /> class.
/// </summary>
/// <param name="pixelBuffer">The pixel buffer returned by WriteableBitmap.PixelBuffer.</param>
public PixelBufferInfo(IBuffer pixelBuffer)
{
_pixelStream = pixelBuffer.AsStream();
this.Bytes = new byte[_pixelStream.Length];
_pixelStream.Seek(0, SeekOrigin.Begin);
_pixelStream.Read(this.Bytes, 0, Bytes.Length);
//this.Pixels = bytes.ToPixels();
}
/// <summary>
/// Updates the associated pixel buffer from bytes.
/// </summary>
public void UpdateFromBytes()
{
_pixelStream.Seek(0, SeekOrigin.Begin);
_pixelStream.Write(Bytes, 0, Bytes.Length);
}
}
/// <summary>
/// Gets the pixels access wrapper for a PixelBuffer property of a WriteableBitmap.
/// </summary>
/// <param name="pixelBuffer">The pixel buffer.</param>
/// <returns></returns>
public static PixelBufferInfo GetPixels(this IBuffer pixelBuffer)
{
return new PixelBufferInfo(pixelBuffer);
}
}
}
关于xaml - Winrt 中的网格效果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19596177/
我想做的是让 JTextPane 在 JPanel 中占用尽可能多的空间。对于我使用的 UpdateInfoPanel: public class UpdateInfoPanel extends JP
我在 JPanel 中有一个 JTextArea,我想将其与 JScrollPane 一起使用。我正在使用 GridBagLayout。当我运行它时,框架似乎为 JScrollPane 腾出了空间,但
我想在 xcode 中实现以下功能。 我有一个 View Controller 。在这个 UIViewController 中,我有一个 UITabBar。它们下面是一个 UIView。将 UITab
有谁知道Firebird 2.5有没有类似于SQL中“STUFF”函数的功能? 我有一个包含父用户记录的表,另一个表包含与父相关的子用户记录。我希望能够提取用户拥有的“ROLES”的逗号分隔字符串,而
我想使用 JSON 作为 mirth channel 的输入和输出,例如详细信息保存在数据库中或创建 HL7 消息。 简而言之,输入为 JSON 解析它并输出为任何格式。 最佳答案 var objec
通常我会使用 R 并执行 merge.by,但这个文件似乎太大了,部门中的任何一台计算机都无法处理它! (任何从事遗传学工作的人的附加信息)本质上,插补似乎删除了 snp ID 的 rs 数字,我只剩
我有一个以前可能被问过的问题,但我很难找到正确的描述。我希望有人能帮助我。 在下面的代码中,我设置了varprice,我想添加javascript变量accu_id以通过rails在我的数据库中查找记
我有一个简单的 SVG 文件,在 Firefox 中可以正常查看 - 它的一些包装文本使用 foreignObject 包含一些 HTML - 文本包装在 div 中:
所以我正在为学校编写一个 Ruby 程序,如果某个值是 1 或 3,则将 bool 值更改为 true,如果是 0 或 2,则更改为 false。由于我有 Java 背景,所以我认为这段代码应该有效:
我做了什么: 我在这些账户之间创建了 VPC 对等连接 互联网网关也连接到每个 VPC 还配置了路由表(以允许来自双方的流量) 情况1: 当这两个 VPC 在同一个账户中时,我成功测试了从另一个 La
我有一个名为 contacts 的表: user_id contact_id 10294 10295 10294 10293 10293 10294 102
我正在使用 Magento 中的新模板。为避免重复代码,我想为每个产品预览使用相同的子模板。 特别是我做了这样一个展示: $products = Mage::getModel('catalog/pro
“for”是否总是检查协议(protocol)中定义的每个函数中第一个参数的类型? 编辑(改写): 当协议(protocol)方法只有一个参数时,根据该单个参数的类型(直接或任意)找到实现。当协议(p
我想从我的 PHP 代码中调用 JavaScript 函数。我通过使用以下方法实现了这一点: echo ' drawChart($id); '; 这工作正常,但我想从我的 PHP 代码中获取数据,我使
这个问题已经有答案了: Event binding on dynamically created elements? (23 个回答) 已关闭 5 年前。 我有一个动态表单,我想在其中附加一些其他 h
我正在尝试找到一种解决方案,以在 componentDidMount 中的映射项上使用 setState。 我正在使用 GraphQL连同 Gatsby返回许多 data 项目,但要求在特定的 pat
我在 ScrollView 中有一个 View 。只要用户按住该 View ,我想每 80 毫秒调用一次方法。这是我已经实现的: final Runnable vibrate = new Runnab
我用 jni 开发了一个 android 应用程序。我在 GetStringUTFChars 的 dvmDecodeIndirectRef 中得到了一个 dvmabort。我只中止了一次。 为什么会这
当我到达我的 Activity 时,我调用 FragmentPagerAdapter 来处理我的不同选项卡。在我的一个选项卡中,我想显示一个 RecyclerView,但他从未出现过,有了断点,我看到
当我按下 Activity 中的按钮时,会弹出一个 DialogFragment。在对话框 fragment 中,有一个看起来像普通 ListView 的 RecyclerView。 我想要的行为是当
我是一名优秀的程序员,十分优秀!