2016-01-28 3 views
0

У меня есть следующий XAML файл:Условный в файле XAML?

<MediaElement Name="mediaElementOne" 
         LoadedBehavior="Manual" 
         Stretch="UniformToFill" 
         ScrubbingEnabled="True" 
         MediaOpened="Media_Success" 
         MediaFailed="Media_Failure"/> 

Свойство MediaOpened в настоящее время называет «Media_Success», когда средства массовой информации успешно загружены.

Моя проблема связана с MediaFailed, потому что я хочу, чтобы MediaFailed запускался с булевым, то есть мне нужно, чтобы это было условным, основанным на логическом в моем файле .cs для вышеупомянутого файла XAML.

Как написать условное выражение в файле XAML? Или как я смогу сделать это в файле .cs.

Прямо сейчас, как только .net считает, что медиа не удалось запустить функцию Media_Failure. Я не хочу, чтобы он запускал функцию Media_Failure, когда для определенного логического значения установлено значение false, и по причинам, выходящим за рамки этого вопроса, я не могу справиться с состоянием внутри функции Media_Failure.

Дополнительная информация: Вот метод он срабатывает на файл .cs:

private void Media_Failure(object sender, ExceptionRoutedEventArgs e){...} 

ответ

0

Узор, как это приходит на ум, когда вы установите или снимите обработчик событий MediaFailed на основе логического значения, которые вам создать свойство с помощью геттера/сеттера.

private bool _isMediaFailureEnabled; 
public bool isMediaFailureEnabled 
{ 
    get 
    { 
     return _isMediaFailureEnabled; 
    } 

    set 
    { 
     if (_isMediaFailureEnabled != value) 
     { 
      _isMediaFailureEnabled = value; 
      if (_isMediaFailureEnabled) 
      { 
       mediaElementOne.MediaFailed += MediaElementOne_MediaFailed; 
      } 
      else 
      { 
       mediaElementOne.MediaFailed -= MediaElementOne_MediaFailed; 
       // OR 
       // mediaElementOne.MediaFailed = null; 
      } 
     } 
    } 
} 

Вы должны внушать от этой модели и адаптироваться к коду, но это должно сделать то, что вы хотите.

Edit:

Мысль об этом еще по какой-то причине, и прибыли в качестве альтернативы, которая очень похожа на то, что Морис придумал, используя уровень абстракции, чтобы решить эту проблему.

Определение обертку или отказавший событие:

MediaFailed="Media_Failure_Wrapper" 

Всегда пусть это можно назвать, и вызывать только исходный обработчик событий, когда ваш булево верно:

private void Media_Failure_Wrapper(object sender, ExceptionRoutedEventArgs e) 
{ 
    if (_isMediaFailureEnabled) 
    { 
     return Media_Failure(sender, e); 
    } 
    else 
    { 
     e.Handled = true; 
     return; 
    } 
} 
+0

Я дам этому выстрел и обновление, если он работает. – ConfusedDeer

1

Вы можете использовать триггеры.

Этот код относится к winrt xaml. То же самое можно сделать в wpf

<Interactivity:Interaction.Behaviors> 
      <Core:DataTriggerBehavior Binding="{Binding IsFailed}" Value="True"> 
       <Core:CallMethodAction MethodName="MediaFailed"/> 
      </Core:DataTriggerBehavior> 
     </Interactivity:Interaction.Behaviors> 

Это будет происходить с вашим элементом мультимедиа. Итак, если ваш bool истинен, он вызовет метод.

0

Это способ сделать это (без дополнительной библиотеки, как интерактивность и т. Д.).

Создайте класс-помощник: (что дает вам гибкость для записи логики событий и/или поведения и/или триггеров и/или командных привязок и/или среднего слоя для обработки событий).

public class RoutedEventTrigger : FrameworkElement 
{  
    RoutedEvent _routedEvent; 
    public RoutedEvent RoutedEvent 
    { 
     get { return _routedEvent; } 
     set { _routedEvent = value; } 
    } 

    private Action<object, RoutedEventArgs> handler; 
    public Action<object, RoutedEventArgs> Handler 
    { 
     get { return handler; } 
     set { handler = value; } 
    } 

    public static DataTemplate GetTemplate(DependencyObject obj) 
    { 
     return (DataTemplate)obj.GetValue(TemplateProperty); 
    } 

    public static void SetTemplate(DependencyObject obj, DataTemplate value) 
    { 
     obj.SetValue(TemplateProperty, value); 
    } 

    public static readonly DependencyProperty TemplateProperty = 
     DependencyProperty.RegisterAttached("Template", 
     typeof(DataTemplate), 
     typeof(RoutedEventTrigger), 
     new PropertyMetadata(default(DataTemplate), OnTemplateChanged)); 

    private static void OnTemplateChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
    { 
     DataTemplate dt = (DataTemplate)e.NewValue; 
     if (dt != null) 
     { 
      dt.Seal(); 
      RoutedEventTrigger ih = (RoutedEventTrigger)dt.LoadContent(); 
      (d as FrameworkElement).AddHandler(ih.RoutedEvent, new RoutedEventHandler(ih.OnRoutedEvent));     
     } 
    } 

    void OnRoutedEvent(object sender, RoutedEventArgs args) 
    { 
     Handler.Invoke(sender, args); 
    } 

} 

XAML: (. Просто установите свойства хелперов класса из XAML, и это будет работать с любым элементом)

<Button Height="100" Width="200" Content="Click" Name="mybutton" > 
     <Button.Style> 
      <Style TargetType="{x:Type Button}"> 
       <Style.Triggers> 
        <DataTrigger Binding="{Binding IsEventAttached}" Value="true"> 
         <Setter Property="local:RoutedEventTrigger.Template"> 
          <Setter.Value> 
           <DataTemplate> 
            <local:RoutedEventTrigger RoutedEvent="Button.Click" Handler="MySlider_ValueChanged" />           
           </DataTemplate> 
          </Setter.Value> 
         </Setter>        
        </DataTrigger> 
       </Style.Triggers> 
      </Style> 
     </Button.Style>   
    </Button> 
Смежные вопросы