कोई अंतर्निहित तरीका तो यहाँ है, है कि कैसे मैं यह कर:
<Button Content="I am a button">
<i:Interaction.Triggers>
<i:EventTrigger EventName="MouseEnter">
<i:InvokeCommandAction Command="{Binding CommandWithNoArgs}" />
</i:EventTrigger>
</i:Interaction.Triggers>
</Button>
हम EventArgs
MouseEnter
उपयोग नहीं कर सकते:
क्लासिक इंटरेक्शन ट्रिगर इस तरह प्रयोग किया जाता है बाध्यकारी के माध्यम से घटना, तो हम उस टुकड़े को संशोधित करने जा रहे हैं जो इसे दूर करता है।
जैसा होता है, वह टुकड़ा InvokeCommandAction
है।
"तो हम बस इसे सबक्लास करने जा रहे हैं और एक सुविधाजनक विधि को ओवरराइड कर रहे हैं जो हमारे साथ इंतजार कर रहा था" जो मुझे लिखना पसंद था। लेकिन कक्षा सील कर दी गई है।
तो हम अपनी मूल उपवर्ग करने के लिए जा रहे हैं (सार) वर्ग: TriggerAction<DependencyObject>
सबसे बुनियादी दिया गया है:
public class InteractiveCommand : TriggerAction<DependencyObject>
{
protected override void Invoke(object parameter)
{
}
}
और वह parameter
अपने EventArgs
है!
लेकिन पकड़ो, यह इतना आसान नहीं है, हमें नियमित InvokeCommandAction
के व्यवहार को पुन: पेश करना होगा।
परावर्तक के माध्यम से, मैंने इसे संकुचित कर दिया (लेकिन आप आधिकारिक स्रोत को देख सकते हैं, मैं सिर्फ आलसी हूं)।
हम CommandParameter
निर्भरता संपत्ति के बारे में परवाह नहीं करेंगे, हम यह मानने जा रहे हैं कि यदि आप InvokeCommandAction
के बजाय इसका उपयोग करते हैं, तो आप वास्तव में EventArgs
हर बार चाहते हैं।
यहाँ पूर्ण वर्ग चला जाता है (WPF केवल, Silverlight के लिए संपादित करें देखें):
public class InteractiveCommand : TriggerAction<DependencyObject>
{
protected override void Invoke(object parameter)
{
if (base.AssociatedObject != null)
{
ICommand command = this.ResolveCommand();
if ((command != null) && command.CanExecute(parameter))
{
command.Execute(parameter);
}
}
}
private ICommand ResolveCommand()
{
ICommand command = null;
if (this.Command != null)
{
return this.Command;
}
if (base.AssociatedObject != null)
{
foreach (PropertyInfo info in base.AssociatedObject.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance))
{
if (typeof(ICommand).IsAssignableFrom(info.PropertyType) && string.Equals(info.Name, this.CommandName, StringComparison.Ordinal))
{
command = (ICommand)info.GetValue(base.AssociatedObject, null);
}
}
}
return command;
}
private string commandName;
public string CommandName
{
get
{
base.ReadPreamble();
return this.commandName;
}
set
{
if (this.CommandName != value)
{
base.WritePreamble();
this.commandName = value;
base.WritePostscript();
}
}
}
#region Command
public ICommand Command
{
get { return (ICommand)GetValue(CommandProperty); }
set { SetValue(CommandProperty, value); }
}
// Using a DependencyProperty as the backing store for Command. This enables animation, styling, binding, etc...
public static readonly DependencyProperty CommandProperty =
DependencyProperty.Register("Command", typeof(ICommand), typeof(InteractiveCommand), new UIPropertyMetadata(null));
#endregion
}
किसी भी कोड आप इंटरनेट, से लाने के साथ होता है मैं अत्यधिक पूरी कक्षा के माध्यम से पढ़ने, और समझने की कोशिश कर recommand यह क्या करता है। इसे अपने ऐप में न फेंकें।
अब हम कर सकते हैं:
<Button Content="I am a button">
<i:Interaction.Triggers>
<i:EventTrigger EventName="MouseEnter">
<local:InteractiveCommand Command="{Binding CommandWithEventArgs}" />
</i:EventTrigger>
</i:Interaction.Triggers>
</Button>
और पीछे कोड:
#region CommandWithEventArgs
DelegateCommand<MouseEventArgs> _CommandWithEventArgs;
/// <summary>
/// Exposes <see cref="CommandWithEventArgs(MouseEventArgs)"/>.
/// </summary>
public DelegateCommand<MouseEventArgs> CommandWithEventArgs
{
get { return _CommandWithEventArgs ?? (_CommandWithEventArgs = new DelegateCommand<MouseEventArgs>(CommandWithEventArgs)); }
}
#endregion
public void CommandWithEventArgs(MouseEventArgs param)
{
}
और वह एक चादर है;)
संपादित करें: Silverlight के लिए, इस कोड के बजाय का उपयोग करें:
public class InteractiveCommand : TriggerAction<DependencyObject>
{
protected override void Invoke(object parameter)
{
if (base.AssociatedObject != null)
{
ICommand command = Command;
if ((command != null) && command.CanExecute(parameter))
{
command.Execute(parameter);
}
}
}
#region Command
public ICommand Command
{
get { return (ICommand)GetValue(CommandProperty); }
set { SetValue(CommandProperty, value); }
}
// Using a DependencyProperty as the backing store for Command. This enables animation, styling, binding, etc...
public static readonly DependencyProperty CommandProperty =
DependencyProperty.Register("Command", typeof(ICommand), typeof(InteractiveCommand), new UIPropertyMetadata(null));
#endregion
}
लेकिन कृपया ध्यान दें कि पूर्ण पूर्ण WPF संस्करण (प्रकारों की जांच नहीं करता है, जमे हुए तत्वों के साथ क्रैश हो सकता है) का उपयोग करने से कम सुरक्षित है।
प्रश्न के शीर्षक में टैग न डालें। अच्छे शीर्षक लिखने पर [यह लिंक] देखें (http://meta.stackexchange.com/questions/10647/how-do-i-write-a-good-title); –