gpt4 book ai didi

wpf - 交互触发条件和其他适配器

转载 作者:行者123 更新时间:2023-12-03 10:48:56 30 4
gpt4 key购买 nike

我需要将一些其他条件与互动触发器一起使用,例如:

作为对事件的 react ,我想执行命令,但前提是条件匹配。我也想命令会被延迟执行。我可以用那个伪xaml表达这一点。

<ci:RoutedEventTrigger Event="{x:Static Selector.SelectionChangedEvent}">
<li:TriggerCondition ActualValue="{Binding Value}" ExpectedValue="{StaticResource foo}">
<li:DelayAction DelayTime="{StaticResource delayTime}">
<InvokeCommandAction CommandName="{StaticResourc commandName}"/>
</li:DelayAction>
</li:TriggerCondition>
</ci:RoutedEventTrigger>

我尝试编写TriggerCondition和DelayAction类,但是几乎所有的交互性代码都是内部的。

所以问题是我如何达到期望的行为?
用条件和延迟编写RoutedEventTrigger看起来不太通用,此外,我还有InputBindingTrigger等。

提前致谢

更新:
我已经使用反射完成了我想要的操作,但是我仍然在寻找您的建议以正确的方式进行操作:)
  [ContentProperty("Actions")]
public abstract class TriggerDecorator : TriggerAction<DependencyObject>
{
private static readonly DependencyPropertyKey ActionsPropertyKey =
DependencyProperty.RegisterReadOnly("Actions", typeof (TriggerActionCollection),typeof (TriggerDecorator), new FrameworkPropertyMetadata());
public static readonly DependencyProperty ActionsProperty = ActionsPropertyKey.DependencyProperty;
public TriggerActionCollection Actions
{
get { return (TriggerActionCollection) GetValue(ActionsProperty); }
}

private readonly MethodInfo myTriggerAction_CallInvokeMethod;

public TriggerDecorator()
{
var triggerActionType = typeof (TriggerAction);
myTriggerAction_CallInvokeMethod = triggerActionType.GetMethod("CallInvoke", BindingFlags.Instance | BindingFlags.NonPublic);
if(myTriggerAction_CallInvokeMethod == null)
throw new InvalidOperationException();

var actionCollection = (TriggerActionCollection)Activator.CreateInstance(typeof(TriggerActionCollection), true);
SetValue(ActionsPropertyKey, actionCollection);
}

protected override void OnAttached()
{
base.OnAttached();

if(AssociatedObject == null)
return;
Actions.Attach(AssociatedObject);
}

protected override void OnDetaching()
{
base.OnDetaching();
Actions.Detach();
}

protected void ExecuteActions(object parameter)
{
var param = new[] {parameter};
foreach (var triggerAction in Actions)
myTriggerAction_CallInvokeMethod.Invoke(triggerAction, param);
}
}

最佳答案

您可以自定义EventTrigger这样的事情应该起作用:

  public sealed class DelayAction : System.Windows.Interactivity.EventTrigger
{
private EventArgs _eventArgs;
private DispatcherTimer _delayTimer;

public static readonly DependencyProperty DelayProperty =
DependencyProperty.Register("Delay", typeof(double)
, typeof(DelayAction), new PropertyMetadata(0.0));

public double Delay
{
get { return (double)base.GetValue(DelayProperty); }
set { base.SetValue(DelayProperty, value); }
}

protected override void OnDetaching()
{
if (_delayTimer != null)
{
_delayTimer.Stop();
_delayTimer = null;
}
base.OnDetaching();
}

protected override void OnEvent(EventArgs eventArgs)
{
if (_delayTimer != null)
{
_delayTimer.Stop();
}
_eventArgs = eventArgs;
_delayTimer = new DispatcherTimer();
_delayTimer.Interval = TimeSpan.FromMilliseconds(this.Delay);
_delayTimer.Tick += new EventHandler(TimerTick);
_delayTimer.Start();
}

private void TimerTick(object sender, EventArgs e)
{
this._delayTimer.Stop();
base.InvokeActions(this._eventArgs);
}
}
用法:
<Button Click="Button_Click">
<i:Interaction.Triggers>
<myTriggers:DelayAction Delay="1000" EventName="Click">
// do stuff
</myTriggers:DelayAction>
</i:Interaction.Triggers>
</Button>

关于wpf - 交互触发条件和其他适配器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13846065/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com