Контент PivotItem с использованием кода? - PullRequest
0 голосов
/ 10 ноября 2011

OK ...

Это меня смущает ... У меня есть способ думать об этом ... но я не знаю, с чего начать.

Я хотел бы добавить PivotItem в код, например ...

for (int i = 0; i < App.Accounts.Items.Count; i++)
{
     PivotItem pvItem = new PivotItem();

     pvItem.Header = App.Accounts.Items[i].Username;

     pvItem.Content = "";

     pivotControl.Items.Add(pvItem);
}

Теперь моя проблема заключается в настройке содержимого PivotItem.

Я хотел бы установить этот код в качестве содержимого:

            <ListBox x:Name="Accounts" Margin="0,0,-12,0">
                <StackPanel Orientation="Horizontal" Margin="0,0,0,17">
                    <StackPanel Width="455" x:Name="accWidth">
                        <TextBlock Text="Personal Account" FontSize="32" Margin="0,0,0,0" TextAlignment="Center" />
                        <toolkit:ToggleSwitch Header="Signed On" Tag="{Binding Tag}" IsChecked="{Binding SignedOn}" Checked="ToggleSwitch_Checked" Unchecked="ToggleSwitch_Unchecked" />
                        <toolkit:ToggleSwitch Header="Invisible Login" Tag="{Binding Tag}" IsChecked="{Binding InvisibleLogin}" Checked="ToggleSwitch_Checked" Unchecked="ToggleSwitch_Unchecked" />
                        <toolkit:ToggleSwitch Header="Show as Windows Phone 7" Tag="{Binding Tag}" IsChecked="{Binding MobileLogin}" Checked="ToggleSwitch_Checked" Unchecked="ToggleSwitch_Unchecked" />                            
                    </StackPanel>
                </StackPanel>
            </ListBox>

Что я могу думать о том, чтобы сделать IS: каким-то образом создать еще один лист .XAML с указанным выше кодом, однако, как бы я объявил:

pvItem.Content = XAMLSheet.xaml;

Если нет другого пути, я думаю, что именно так мне придется это делать.

Мне также нужно, чтобы события работали, и теги должны применяться с использованием кода вместо привязки данных, как у меня было изначально.

Я пытался это сделать, но он показывает только текст, а не код ...

pvItem.Content = "<TextBlock Text=\"Hello\" />";

Спасибо.

Ответы [ 4 ]

1 голос
/ 27 ноября 2011

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

<UserControl x:Class="MyUserControl"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d"
    FontFamily="{StaticResource PhoneFontFamilyNormal}"
    FontSize="{StaticResource PhoneFontSizeNormal}"
    Foreground="{StaticResource PhoneForegroundBrush}"
    d:DesignHeight="480" d:DesignWidth="480">

    <Grid x:Name="LayoutRoot">
       <ListBox x:Name="Accounts" Margin="0,0,-12,0">
            <StackPanel Orientation="Horizontal" Margin="0,0,0,17">
                <StackPanel Width="455" x:Name="accWidth">
                    <TextBlock Text="Personal Account" FontSize="32" Margin="0,0,0,0" TextAlignment="Center" />
                    <toolkit:ToggleSwitch Header="Signed On" Tag="{Binding Tag}" IsChecked="{Binding SignedOn}" Checked="ToggleSwitch_Checked" Unchecked="ToggleSwitch_Unchecked" />
                    <toolkit:ToggleSwitch Header="Invisible Login" Tag="{Binding Tag}" IsChecked="{Binding InvisibleLogin}" Checked="ToggleSwitch_Checked" Unchecked="ToggleSwitch_Unchecked" />
                    <toolkit:ToggleSwitch Header="Show as Windows Phone 7" Tag="{Binding Tag}" IsChecked="{Binding MobileLogin}" Checked="ToggleSwitch_Checked" Unchecked="ToggleSwitch_Unchecked" />                            
                </StackPanel>
            </StackPanel>
        </ListBox>
    </Grid>
</UserControl>

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

for (int i = 0; i < App.Accounts.Items.Count; i++)
{
    PivotItem pvItem = new PivotItem();
    pvItem.Header = App.Accounts.Items[i].Username;

    //instantiate your control and set the DataContext/ItemsSource to your model it will be bound to
    MyUserControl myControl = new MyUserControl();
    myControl.DataContext = someModel;
    myControl.List.ItemsSource = someModel.List;

    //assign content to the instance of your user control
    pvItem.Content = myControl;         

    pivotControl.Items.Add(pvItem);
}
0 голосов
/ 10 ноября 2011

Я кое-что понял ...

Не могу придумать другого пути, кроме этого:

            ListBox lb = new ListBox();

            lb.Margin = new Thickness(0, 0, -12, 0);

            TextBlock tb = new TextBlock();

            tb.Text = App.Accounts.Items[i].Description;

            tb.FontSize = 32;

            tb.TextAlignment = TextAlignment.Center;

            tb.Width = 455;

            ToggleSwitch signOn = new ToggleSwitch();

            signOn.Tag = i.ToString();

            signOn.Header = "Signed On";

            signOn.IsChecked = App.Accounts.Items[i].SignedOn;

            signOn.Checked += new EventHandler<RoutedEventArgs>(signOn_Checked);

            signOn.Unchecked += new EventHandler<RoutedEventArgs>(signOn_Unchecked);

            signOn.Width = 455;

            ToggleSwitch invisLogin = new ToggleSwitch();

            invisLogin.Tag = i.ToString();

            invisLogin.Header = "Invisible Login";

            invisLogin.IsChecked = App.Accounts.Items[i].InvisibileLogin;

            invisLogin.Checked += new EventHandler<RoutedEventArgs>(invisLogin_Checked);

            invisLogin.Unchecked += new EventHandler<RoutedEventArgs>(invisLogin_Unchecked);

            invisLogin.Width = 455;

            ToggleSwitch wpLogin = new ToggleSwitch();

            wpLogin.Tag = i.ToString();

            wpLogin.Header = "Show as Windows Phone 7";

            wpLogin.IsChecked = App.Accounts.Items[i].InvisibileLogin;

            wpLogin.Checked += new EventHandler<RoutedEventArgs>(wpLogin_Checked);

            wpLogin.Unchecked += new EventHandler<RoutedEventArgs>(wpLogin_Unchecked);

            wpLogin.Width = 455;

            lb.Items.Add(tb);

            lb.Items.Add(signOn);

            lb.Items.Add(invisLogin);

            lb.Items.Add(wpLogin);

            pvItem.Content = lb;

Есть ли способ улучшить код / ​​сделать его менее небрежным?

Спасибо.

0 голосов
/ 10 ноября 2011

Альтернативой было бы НЕ использовать код вообще, а вместо этого использовать привязку данных для заполнения Pivot.

Связывание данных сводных элементов с наблюдаемой коллекцией на WP7

0 голосов
/ 10 ноября 2011

Если вам действительно нужно добавить код из фрагмента xaml, вы можете сделать XamlReader.Load (), хотя я не уверен, зачем вам это нужно. Если вы хотите, чтобы Pivot был построен из коллекции, почему бы просто не привязать его к ItemsSource и поместить ваш xaml в качестве ItemTemplate? Возможно, вам придется избавиться от обработчиков событий и вместо этого изменить привязки IsChecked на Mode = TwoWay.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...