- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
请考虑以下说明我的问题的简化示例:
主窗口.xaml
<Window x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Width="500" Height="500"
Title="Click anywhere to animate the movement of the blue thingy...">
<Canvas
x:Name="canvas"
HorizontalAlignment="Stretch"
VerticalAlignment="Stretch"
Background="AntiqueWhite"
MouseDown="canvas_MouseDown" />
</Window>
using System;
using System.Windows;
using System.Windows.Input;
using System.Windows.Media.Animation;
namespace WpfApplication1
{
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
this.canvas.Children.Add(new Thingy());
}
private void canvas_MouseDown(object sender, MouseButtonEventArgs e)
{
var thingy = (Thingy)this.canvas.Children[0];
var from = new Point(0.0, 0.0);
var to = new Point(
canvas.ActualWidth - thingy.ActualWidth,
canvas.ActualHeight - thingy.ActualHeight
);
var locAnim = new PointAnimation(
from,
to,
new Duration(TimeSpan.FromSeconds(5))
);
locAnim.Completed += (s, a) =>
{
// Only at this line does the thingy move to the
// correct position...
thingy.Location = to;
};
thingy.Location = from;
thingy.BeginAnimation(Thingy.LocationProperty, locAnim);
}
}
}
<UserControl x:Class="WpfApplication1.Thingy"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Width="50" Height="50" Background="Blue" />
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
namespace WpfApplication1
{
public partial class Thingy : UserControl
{
public static DependencyProperty LocationProperty =
DependencyProperty.Register(
"Location",
typeof(Point),
typeof(Thingy)
);
public Thingy()
{
InitializeComponent();
Canvas.SetLeft(this, 0.0);
Canvas.SetTop(this, 0.0);
var xBind = new Binding();
xBind.Source = this;
xBind.Path = new PropertyPath(Canvas.LeftProperty);
xBind.Mode = BindingMode.TwoWay;
var yBind = new Binding();
yBind.Source = this;
yBind.Path = new PropertyPath(Canvas.TopProperty);
yBind.Mode = BindingMode.TwoWay;
var locBind = new MultiBinding();
locBind.Converter = new PointConverter();
locBind.Mode = BindingMode.TwoWay;
locBind.Bindings.Add(xBind);
locBind.Bindings.Add(yBind);
BindingOperations.SetBinding(
this,
Thingy.LocationProperty,
locBind
);
}
public Point Location
{
get
{
return (Point)this.GetValue(LocationProperty);
}
set
{
this.SetValue(LocationProperty, value);
}
}
}
}
using System;
using System.Globalization;
using System.Windows;
using System.Windows.Data;
namespace WpfApplication1
{
public class PointConverter : IMultiValueConverter
{
public object Convert(object[] v, Type t, object p, CultureInfo c)
{
return new Point((double)v[0], (double)v[1]);
}
public object[] ConvertBack(object v, Type[] t, object p, CultureInfo c)
{
return new object[] { ((Point)v).X, ((Point)v).Y };
}
}
}
LocationProperty
操纵和访问Canvas.LeftProperty
和 Canvas.TopProperty
值(value)观。 LocationProperty
与 PointAnimation
类(class)。 LocationProperty
设置动画时才出现。它的行为是否不符合预期。
Thingy
的实例应该随着动画的进行而移动。
DoubleAnimation
的两个实例来完成此操作。类(class)。
Point
是值类型,那么我怀疑我可以定义自己的
Point
输入和我自己的
AnimationTimeline
.这不是我想做的。这是一个更大的项目的一部分,
LocationProperty
将用于其他事情。
最佳答案
这是动画某些东西的最简单的代码。
using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
using System.Windows.Media.Animation;
namespace WpfApplication1
{
public partial class MainWindow
{
public MainWindow()
{
InitializeComponent();
}
private void MainWindow_OnMouseDown(object sender, MouseButtonEventArgs e)
{
var x = Canvas.GetLeft(Control1);
var y = Canvas.GetTop(Control1);
x = double.IsNaN(x) ? 0 : x;
y = double.IsNaN(y) ? 0 : y;
var point1 = new Point(x, y);
var point2 = e.GetPosition(this);
var animation = new PointAnimation(point1, point2, new Duration(TimeSpan.FromSeconds(1)));
animation.EasingFunction = new CubicEase();
Control1.BeginAnimation(UserControl1.LocationProperty, animation);
}
}
}
<Window x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:WpfApplication1"
mc:Ignorable="d"
Title="MainWindow" Height="350" Width="525" MouseDown="MainWindow_OnMouseDown">
<Canvas>
<local:UserControl1 Background="Red" Height="100" Width="100" x:Name="Control1" />
</Canvas>
</Window>
using System.Windows;
using System.Windows.Controls;
namespace WpfApplication1
{
public partial class UserControl1
{
public static readonly DependencyProperty LocationProperty = DependencyProperty.Register(
"Location", typeof(Point), typeof(UserControl1), new UIPropertyMetadata(default(Point), OnLocationChanged));
public UserControl1()
{
InitializeComponent();
}
public Point Location
{
get { return (Point) GetValue(LocationProperty); }
set { SetValue(LocationProperty, value); }
}
private static void OnLocationChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
var control1 = (UserControl1) d;
var value = (Point) e.NewValue;
Canvas.SetLeft(control1, value.X);
Canvas.SetTop(control1, value.Y);
}
}
}
<UserControl x:Class="WpfApplication1.UserControl1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:WpfApplication1"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="300">
</UserControl>
Canvas.[Left|Top]Property
:
using System;
using System.ComponentModel;
using System.Windows;
using System.Windows.Controls;
namespace WpfApplication1
{
public partial class UserControl1
{
public static readonly DependencyProperty LocationProperty = DependencyProperty.Register(
"Location", typeof(Point), typeof(UserControl1), new PropertyMetadata(default(Point), OnLocationChanged));
public UserControl1()
{
InitializeComponent();
DependencyPropertyDescriptor.FromProperty(Canvas.LeftProperty, typeof(Canvas))
.AddValueChanged(this, OnLeftChanged);
DependencyPropertyDescriptor.FromProperty(Canvas.TopProperty, typeof(Canvas))
.AddValueChanged(this, OnTopChanged);
}
public Point Location
{
get { return (Point) GetValue(LocationProperty); }
set { SetValue(LocationProperty, value); }
}
private void OnLeftChanged(object sender, EventArgs eventArgs)
{
var left = Canvas.GetLeft(this);
Location = new Point(left, Location.Y);
}
private void OnTopChanged(object sender, EventArgs e)
{
var top = Canvas.GetTop(this);
Location = new Point(Location.X, top);
}
private static void OnLocationChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
var control1 = (UserControl1) d;
var value = (Point) e.NewValue;
Canvas.SetLeft(control1, value.X);
Canvas.SetTop(control1, value.Y);
}
}
}
关于c# - WPF 将 Canvas.Left/Canvas.Top 绑定(bind)到点 DependencyProperty,使用 PointAnimation,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41767915/
我有一个包含只读 DependencyProperty 的类。从这个类中,我想绑定(bind)到只读 DependencyProperty到另一个只读 DepenendencyProperty另一个类
我有一个带有 ComboBox 的控件: 这是PropertyChangedCallback为属性(property) SelectedTrace在包含 ComboBox 的 OuterContro
我是 WPF/MVVM 的新手,我发现的示例似乎没有涵盖我面临的问题。 我有一个用于管理相当复杂的业务配置对象的屏幕。在 MVVM 中,我认为这意味着我应该具有以下内容: 具有接近于零逻辑的 XAML
我正在探索 WPF 世界,我在网上找到了一个关于如何在 xml 上使用绑定(bind)的好例子 http://www.codeproject.com/Articles/37854/How-to-Per
我有一个自定义类 MyPerson。所有(相关)属性都实现 INotifyPropertyChanged。 我创建了一个 UserControl 来显示它,一切正常。绑定(bind)到 MyPerso
我试图在我的代码中使用 tis 依赖属性,但它给了我错误,说默认值类型与属性“MyProperty”的类型不匹配。 但 short 应该接受 0 作为默认值。 如果我尝试给它一个 null 作为默认值
我在我的用户控件中定义了这样的属性: public bool IsSelected { get { return (bool)GetValue(IsSelectedProperty);
在我的用户控件中: public ODIF.DeviceChannel Channel { get { return (ODIF.DeviceChannel)GetValue(ChannelD
我在 WPF 应用程序的 ViewModel 中有这个简单的示例: class VM_DiskPartition : DependencyObject { // (...) Other
在previous post中我问如何将属性注册为 DependencyProperty。我得到了答案并且效果很好。 但现在我想在单击时向此 DependencyProperty 添加一些项目。这是行
我有两个对象绑定(bind)到同一个 dependencyProperty(在 Silverlight 中)。有没有办法确定这两个对象中的哪一个改变了属性?我想根据这些信息采取不同的行动。 不幸的是,
我正在将 XAML 序列化为文件并再次读取它(使用 XamlWriter 和 XamlReader)。 如果从未为元素设置 DependencyProperty(如 FrameworkElement
我有一个名为 ChartView 的用户控件。我有一个 ObservableCollection 类型的属性。我在 ChartView 中实现了 INotifyPropertyChanged。 Cha
虽然网络上的大多数代码示例都使用 DependencyProperties 的静态声明,但我发现在某些情况下它们被定义为公共(public)只读实例成员。 将 DependencyProperty 定
我有析构函数问题。这是重现问题的代码: class DPDemo : DependencyObject { public DPDemo() { } ~DPDemo()
在我的 XAML 中,我有一个带有 DependencyProperty 的对象: 我还有MouseUp处理程序 TextBlock .我如何获得 OverWidth属性值在里面? 最佳答案 这似乎
我正在创建一个模仿 AppBarButton 的自定义控件(但具有自定义功能,因此我们无法从 AppBarButton 派生)。 我的问题是 AppBarButton 的 Icon 属性。该属性本身采
如何将属性名称(字符串形式)转换为 DependencyProperty? 我有一组属性名称、它的字符串值和一个 DependencyObject。现在我想将这些属性值设置为 DependencyOb
我的控件有一个映射到私有(private)变量的属性。设置属性时,我还需要存储某个其他变量。当属性的私有(private)变量由我自己的控制代码设置时,一定不会出现这种特殊处理。一切顺利。 我现在需要
我正在尝试创建一个用户控件,其中包含一些 DependencyProperties,这些属性会转发给用户控件中的子控件。经过几次尝试,我开始工作了。为了测试一个小例子。 在示例中,我有一个名为 Ctr
我是一名优秀的程序员,十分优秀!