2013-06-13 7 views
2

Я получил следующий сценарий привязки xaml, работающий в WPF. Определите UIElements в статьях Grid. Свяжите эти статические ресурсы с ToggleButtonTag. На кнопке переключения выберите свойство Tag собственности Content объекта ContentControl.Установить ContentControls Content Свойство из codebehind throws исключение «значение не попадает в диапазон»

<Grid> 
    <Grid.Resources> 
     <TextBlock x:Key="t1" 
        Grid.Row="1" 
        Text="Text1" /> 
     <TextBlock x:Key="t2" 
        Grid.Row="1" 
        Text="Text2" /> 
    </Grid.Resources> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="Auto" /> 
     <RowDefinition Height="*" /> 
    </Grid.RowDefinitions> 

    <StackPanel Orientation="Horizontal" 
       HorizontalAlignment="Center"> 
     <ToggleButton Tag="{StaticResource t1}" 
         Margin="10" 
         Click="ButtonBase_OnClick" 
         Content="T1" /> 
     <ToggleButton Tag="{StaticResource t2}" 
         Margin="10" 
         Click="ButtonBase_OnClick" 
         Content="T1" /> 
    </StackPanel> 

    <ContentControl x:Name="cc" 
        Grid.Row="1" /> 
</Grid> 

Кнопка переключения нажмите просто присваивает значение тега в Content собственности.

private void ButtonBase_OnClick(object sender, RoutedEventArgs e) 
{ 
    cc.Content = ((FrameworkElement)sender).Tag; 
} 

Хотя это работает во всемогущем WPF, это невозможно в WinRT. WinRT жалуется на ArgumentException «Значение не входит в ожидаемый диапазон». Я не знаю, почему?

Для тестирования я попробовал прямое назначение в обработчик событий, который работал, как и ожидалось:

cc.Content = new TextBlock { Text = "Text1" }; 

Чтобы сделать это еще более странно, я попробовал этот в WinRT:

<ContentControl x:Name="cc" 
       Content="{StaticResource t1}" 
       Grid.Row="1" /> 

Результат : Он работает в дизайнере, но не работает во время выполнения. Еще более невежественным об этом.

Прежде всего, что пытается сказать мне аргумент ArgumentException? Во-вторых, почему он работает в WPF? Как насчет расхождения между временем выполнения и конструктором VS?

+0

Я понятия не имею, о чем вы говорите. Все это звучит как ужасный взлом, я имею в виду свойство «Tag»? Что это за winforms? Почему бы вам не создать надлежащую ViewModel и использовать 'DataTemplates' для динамического определения содержимого ContentPresenter? –

+0

Я знаю, что есть гораздо более элегантные решения, подобные тем, которые вы предлагаете. Но мне просто интересно, почему он не работает. Возьмите его как мозговой тизер. – Marius

+0

Прежде чем он взорвется с помощью WinRT, это значение тега TextBlock, как ожидалось? – Pragmateek

ответ

4

В приложениях Win RT/Windows 8 Store приложения Content Control не может содержать элемент, который уже присутствует в представлении в другом месте. Поскольку он существует в Grid.Resources, его нельзя добавить в ContentControl.

Я предлагаю сделать DataTemplate вместо этого в ресурсах:

<Grid> 
    <Grid.Resources> 
     <DataTemplate x:Key="t1"> 
      <TextBlock Text="Text1" /> 
     </DataTemplate> 
... 

И в кнопке мыши что-то вроде:

private void ButtonBase_OnClick(object sender, RoutedEventArgs e) 
{ 
    var dataTemplate = ((FrameworkElement)sender).Tag as DataTemplate; 
    cc.Content = dataTemplate.LoadContent() as FrameworkElement; 
} 

Примечание: У меня нет возможности проверить это.

+1

Я сделал это, извлекая UIElement в UserControl. Оно работает –