2013-06-13 4 views
2

J'ai obtenu le scénario de liaison xaml suivant dans WPF. Définir UIElements dans les ressources de Grid. Liez ces ressources statiques à la propriété Tag de ToggleButton. Sur le bouton à bascule, cliquez sur Assigner la propriété Tag à la propriété Content de ContentControl.Définir ContentControls Content La propriété de codebehind renvoie l'exception "la valeur ne se situe pas dans la plage"

<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> 

Le bouton à bascule clic affecte seulement la valeur de Tag à la propriété Content. Bien que cela fonctionne dans WPF tout-puissant, il n'est pas possible dans WinRT. WinRT se plaint d'un ArgumentException 'La valeur ne se situe pas dans la plage attendue.'. Je n'ai aucune idée pourquoi?

Pour des fins de test, j'ai essayé une affectation directe dans le gestionnaire d'événements, qui a fonctionné comme prévu:

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

Pour le rendre, je encore plus bizarre essayé celui-ci dans WinRT:

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

Résultat : Cela fonctionne dans le concepteur, mais échoue à l'exécution. Encore plus de clueless à ce sujet.

Tout d'abord qu'est-ce que l'argument ArgumentException essaie de me dire? Deuxièmement, pourquoi travaille-t-il dans WPF? Qu'en est-il de l'écart entre le moteur d'exécution et le concepteur VS?

+0

Je n'ai aucune idée de ce dont vous parlez. Tout cela ressemble à un hack horrible, je veux dire, la propriété 'Tag'? Quelle est cette winforms? Pourquoi ne créez-vous pas un ViewModel approprié et utilisez 'DataTemplates' pour définir dynamiquement le Contenu' ContentPresenter'? –

+0

Je sais qu'il existe des solutions beaucoup plus élégantes comme celle que vous suggérez. Mais je suis juste curieux de savoir pourquoi ça ne marche pas. Prenez-le comme un casse-tête. – Marius

+0

Avant qu'il n'explose avec WinRT, la balise value un TextBlock comme prévu? – Pragmateek

Répondre

4

Dans Win RT/Windows 8 Store Apps, le contrôle de contenu ne peut pas contenir un élément déjà présent dans la vue à un autre emplacement. Comme il existe dans Grid.Resources, il ne peut pas être ajouté à ContentControl.

je suggère faire une place DataTemplate dans les ressources:

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

Et dans le bouton cliquez sur quelque chose comme:

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

Note: Je n'ai pas la chance de le tester.

+1

Je l'ai fait en extrayant le UIElement à UserControl. Ça marche –

Questions connexes