如何在 WPF 中组合画笔?
我有两把刷子。我不知道它们是什么类型的刷子。它们可以是 ImageBrushes、SolidBrushes 或 VisualBrushes。我将每个都放在“画笔”类型的变量中。
我需要组合两把刷子。我该怎么做?
我试过这个。但这没有用。这是需要我组合的前刷和后刷。
Border Bd = new Border();
Border Bdr = new Border();
Bd.Width = 1.0;
Bd.Height = 1.0;
Bd.Background = Back;
Bdr.Background = Front;
Bd.Child = Bdr;
Brush VB = new VisualBrush(Bd);
我需要这个,因为我正在制作一个自定义动画类来为画笔设置动画。 经过一些测试后,我得出的结论是,错误在于画笔的组合,而不是课堂上的其他地方。
生成的画笔是完全透明的。
[编辑]
这是完整的 BrushAnimation 类。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Media.Animation;
using System.Windows;
using System.Windows.Media;
using System.Windows.Controls;
namespace WPFSoPaTest
{
class BrushAnimation : AnimationTimeline
{
protected override Freezable CreateInstanceCore()
{
return new BrushAnimation();
}
public override Type TargetPropertyType
{
get { return typeof(Brush); }
}
static BrushAnimation()
{
FromProperty = DependencyProperty.Register("From", typeof(Brush),
typeof(BrushAnimation));
ToProperty = DependencyProperty.Register("To", typeof(Brush),
typeof(BrushAnimation));
}
public static readonly DependencyProperty FromProperty;
public Brush From
{
get
{
return (Brush)GetValue(BrushAnimation.FromProperty);
}
set
{
SetValue(BrushAnimation.FromProperty, value);
}
}
public static readonly DependencyProperty ToProperty;
public Brush To
{
get
{
return (Brush)GetValue(BrushAnimation.ToProperty);
}
set
{
SetValue(BrushAnimation.ToProperty, value);
}
}
public override object GetCurrentValue(object defaultOriginValue,
object defaultDestinationValue, AnimationClock animationClock)
{
Brush fromVal = ((Brush)GetValue(BrushAnimation.FromProperty)).CloneCurrentValue();
Brush toVal = ((Brush)GetValue(BrushAnimation.ToProperty)).CloneCurrentValue();
if ((double)animationClock.CurrentProgress == 0.0)
return fromVal; //Here it workes fine.
if ((double)animationClock.CurrentProgress == 1.0)
return toVal; //It workes also here fine.
toVal.Opacity = (double)animationClock.CurrentProgress;
Border Bd = new Border();
Border Bdr = new Border();
Bd.Width = 1.0;
Bd.Height = 1.0;
Bd.Background = fromVal;
Bdr.Background = toVal;
Bd.Visibility = Visibility.Visible;
Bdr.Visibility = Visibility.Visible;
Bd.Child = Bdr;
Brush VB = new VisualBrush(Bd);
return VB; //But here it return's a transparent brush.
//If I return the 'toVal' variable here it animates correctly the opacity.
}
}
}
I have two brushes. I don't know wath type of brushes they are. They can be ImageBrushes, SolidBrushes or VisualBrushes. I have each in a variable of the "Brush" type.
I need to combine two brushes. How do I do it?
I tried this. But It didn't work. Here are Back and Front the brushes that need to me combined.
Border Bd = new Border();
Border Bdr = new Border();
Bd.Width = 1.0;
Bd.Height = 1.0;
Bd.Background = Back;
Bdr.Background = Front;
Bd.Child = Bdr;
Brush VB = new VisualBrush(Bd);
I need this because I am making a custom animation class to animate brushes.
After making some test's I concluded that the error is in the combining of the brushes and not elsewhere in the class.
The resulting brush is completely transparent.
[EDIT]
Here is the complete BrushAnimation Class.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Media.Animation;
using System.Windows;
using System.Windows.Media;
using System.Windows.Controls;
namespace WPFSoPaTest
{
class BrushAnimation : AnimationTimeline
{
protected override Freezable CreateInstanceCore()
{
return new BrushAnimation();
}
public override Type TargetPropertyType
{
get { return typeof(Brush); }
}
static BrushAnimation()
{
FromProperty = DependencyProperty.Register("From", typeof(Brush),
typeof(BrushAnimation));
ToProperty = DependencyProperty.Register("To", typeof(Brush),
typeof(BrushAnimation));
}
public static readonly DependencyProperty FromProperty;
public Brush From
{
get
{
return (Brush)GetValue(BrushAnimation.FromProperty);
}
set
{
SetValue(BrushAnimation.FromProperty, value);
}
}
public static readonly DependencyProperty ToProperty;
public Brush To
{
get
{
return (Brush)GetValue(BrushAnimation.ToProperty);
}
set
{
SetValue(BrushAnimation.ToProperty, value);
}
}
public override object GetCurrentValue(object defaultOriginValue,
object defaultDestinationValue, AnimationClock animationClock)
{
Brush fromVal = ((Brush)GetValue(BrushAnimation.FromProperty)).CloneCurrentValue();
Brush toVal = ((Brush)GetValue(BrushAnimation.ToProperty)).CloneCurrentValue();
if ((double)animationClock.CurrentProgress == 0.0)
return fromVal; //Here it workes fine.
if ((double)animationClock.CurrentProgress == 1.0)
return toVal; //It workes also here fine.
toVal.Opacity = (double)animationClock.CurrentProgress;
Border Bd = new Border();
Border Bdr = new Border();
Bd.Width = 1.0;
Bd.Height = 1.0;
Bd.Background = fromVal;
Bdr.Background = toVal;
Bd.Visibility = Visibility.Visible;
Bdr.Visibility = Visibility.Visible;
Bd.Child = Bdr;
Brush VB = new VisualBrush(Bd);
return VB; //But here it return's a transparent brush.
//If I return the 'toVal' variable here it animates correctly the opacity.
}
}
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
我需要为画笔设置动画的原因是为我在 3d 对象中使用的材质中的画笔设置动画。我认为为画笔设置动画比为材质设置动画更容易。
我已经用上面的方法来组合画笔了,但是这里不行。
经过一番思考后,我决定对材质而不是画笔进行动画处理。
结果比设置画笔动画更容易。
[注意]
这个动画课程适合我的需要。它仅对材质中的画笔进行动画处理。我正在使用此类来替换另一种材质的画笔。
[注意]
“到材料”最终将完全替换“来自材料”,它不会以材料组结尾。
这是 MaterialAnimation 类,供需要的人使用。我还有一个 Point3DCollectionAnimation 类。它可用于制作 3D 网格动画。这非常有用。
您可以在下面找到它。
材质动画
这是 Point3DCollectionAnimation 类。
Point3DCollectionAnimation
我希望这些类对需要它们的人有用。我在互联网上搜索了它们的分配,但没有找到。我相信还有更多的人需要这些课程。
请留下评论。
The reason I need to animate a brush is to animate the brush in a material that I am using in a 3d object. I thought it would be easier to animate the brush than the material.
I have already used the method above to combinate brushes, but it didn't work here.
After thinking a little bit I decided to animate the Material and not the brush.
It resulted to be easier than animating a brush.
[NOTE]
This animation class is adapted for my needs. It only animates the brush in the material. I am using this class to replace the brush of a material for an other.
[NOTE]
The 'to material' will at the end replace completely the 'from material', it will not end with a MaterialGroup.
Here is the MaterialAnimation Class for who needs it. I also have a Point3DCollectionAnimation Class. It can be used to animate 3D meshes. It's very useful.
You can find it below this one.
MaterialAnimation
Here is the Point3DCollectionAnimation Class.
Point3DCollectionAnimation
I hope these classes are usefull for who needs them. I searched for them allot on the internet, but didn't find them. I'm sure that there are more people who needs these classes.
Please leave comments.
我发现了问题。视觉画笔不可冻结。为了使代码正常工作,我需要找到一种冻结画笔的方法。
I discovered the problem. Visual Brushes are not freezable. To the code to work I will need to find a way to freeze the brush.
Aaron,我已经使用了您的 BrushAnimation 类,如上所示,它可以满足我的特定需求。然而,我注意到 StackOverflow 在知识共享许可下运行。因此,从技术上讲,未经您的许可,我无法在我的商业应用程序中使用该类(我不想获得知识共享许可)。你愿意给我许可吗?我仍然可以相信你的工作。
我无法找到任何其他方式联系您,因为我还无法发表评论。
Aaron, I have used your BrushAnimation class as shown above, and it works for my specific needs. However, I noticed that StackOverflow operates under the Creative Commons licence. Thus I technically couldn't use that class in my commercial application (which I don't want to be under the Creative Commons licence) without your permission. Are you willing to give me permission? I can still credit your work.
I couldn't find any other way to contact you about this, since I can't make comments yet.
您可以使用视觉画笔来实现这一点
You can use a visualbrush to achieve that
只要前画笔中有透明像素,上述方法就应该有效。如果不是,前刷只会覆盖后刷。您应该提供一个更完整的示例来了解实际情况。
The above approach should work as long as you have transparent pixels in the front brush. If not the front brush would just overlay the back brush. You should provide a more complete example to see what is actually going on.