【问题标题】:Programatically place TextBox in Grid in Windows Phone 8在 Windows Phone 8 中以编程方式将 TextBox 放置在网格中
【发布时间】:2014-03-12 20:40:50
【问题描述】:

如何以编程方式将 TextBlock 放置在网格中。这是我的 XAML 代码: 我需要添加以编程方式注释掉的 TextBlock。 有一个 SetRow 方法,但它不存在于 ContentPanel 或 LayoutRoot 仅用于 Grid 控件(这是指哪个 Grid ?) 此外,似乎我无法访问 Items 网格,是因为它位于 stackpanel 内吗? 如何解决?我需要做的是将文本块放在网格内的特定行内,并且网格位于堆栈面板和数据模板内。 任何想法如何做到这一点?

谢谢, 贾尼

    <Grid x:Name="LayoutRoot" Background="Transparent">
        <Grid.RowDefinitions>
            <RowDefinition Height="*"/>
       </Grid.RowDefinitions>
    <Grid x:Name="ContentPanel" Grid.Row="0" Margin="12,0,12,0">
        <phone:LongListSelector x:Name="MainLongListSelector" Margin="0,0,-12,0" ItemsSource="{Binding Items}" SelectionChanged="MainLongListSelector_SelectionChanged">
            <phone:LongListSelector.ItemTemplate>
                <DataTemplate>
                  <StackPanel x:Name="stack" Margin="0,0,0,17">
                        <Grid x:Name="Items" Background="Transparent">
                            <Grid.RowDefinitions>
                                <RowDefinition Height="50"/>
                                <RowDefinition Height="50"/>
                                <RowDefinition Height="50"/>
                            </Grid.RowDefinitions>
                            <TextBlock Text="{Binding LineOne}" Grid.Row="0" TextWrapping="Wrap" Style="{StaticResource PhoneTextExtraLargeStyle}"/>
                            <TextBlock Text="{Binding LineTwo}" Grid.Row="1" TextWrapping="Wrap" Margin="12,-6,12,0" Style="{StaticResource PhoneTextSubtleStyle}"/>
                            <!--<TextBlock Text="Hello" Grid.Row="3" TextWrapping="Wrap" Margin="12,-6,12,0" Style="{StaticResource PhoneTextSubtleStyle}"/> -->
                        </Grid>
                    </StackPanel>
                </DataTemplate>
            </phone:LongListSelector.ItemTemplate>
        </phone:LongListSelector>
    </Grid>
</Grid>

【问题讨论】:

    标签: c# xaml windows-phone-8 grid


    【解决方案1】:

    不确定它是否适合您的方案,但您可以将TextBlock 不加注释,但将Visibility 设置为Visibility.Collapsed,如下所示:

    <TextBlock Text="Hello" Name="MyTextBlock" Visibility="Collapsed" Grid.Row="3" TextWrapping="Wrap" Margin="12,-6,12,0" Style="{StaticResource PhoneTextSubtleStyle}"/>
    

    然后在代码中输入 MyTextBlock.Visibility = Visibility.Visible;

    当您使用 MVVM 模式时,您也可以将 Visibility 依赖属性绑定到您的视图模型的属性。

    【讨论】:

    • 谢谢,这可能很棘手,因为我实际上使用的是 RichTextBlock 并且文本包含文本和超链接。这就是你使用它的方式,msdn.microsoft.com/en-us/library/…
    • 点击太早:我需要动态添加文本并将超链接放置在 RichTextBox(而不是块)中的正确位置,以便我看到它我无法在 XAML 中创建它然后打开/关闭可见性。
    • Jani - 您可以在 RichTextBlock 中绑定到 Run 的 Text 属性。如果没有添加任何数据,它将只是空白
    • 在 RichTextBlock 内部可以有 x 个 Run 元素和 HyperLink 元素,例如,如果我有文本:“花很漂亮,狗也很好”,那么“花很漂亮”是 1 Run,然后如果我希望“nice”成为 HyperLink 元素的链接,“所以”是第 2 次运行,而狗又是 HyperLink,所以可以有很多运行和许多超链接,因此我无法事先在 XAML 中制作和转开/关可见性我需要动态创建它们。至少这是我的看法,如果我错了,请纠正我。
    • 听起来像 DataTemplate 不是要走的路。也许最好在后面的代码中创建每个项目并添加到 longlistelector,因为它们是如此不同
    【解决方案2】:

    因此,您要添加的文本块位于堆栈面板中的网格中,该堆栈面板是 LongListSelector 的 DataTemplate 的一部分。所以我们在这里讨论的是动态修改 DataTemplate 的能力

    一种解决方案可能是使用自定义 DataTempleSelector,然后根据您的模型/视图模型中的某些字段,您可以为相应的内容选择适当的 DataTemplate,类似于这些内容

    public abstract class DataTemplateSelector : ContentControl
    {
        public virtual DataTemplate SelectTemplate(object item, DependencyObject container)
        {
            return null;
        }
    
        protected override void OnContentChanged(object oldContent, object newContent)
        {
            base.OnContentChanged(oldContent, newContent);
    
            ContentTemplate = SelectTemplate(newContent, this);
        }
    }
    
    public class CustomTemplateSelector : DataTemplateSelector
    {
        public DataTemplate First
        {
            get;
            set;
        }
    
        public DataTemplate Second
        {
            get;
            set;
        }
    
        public override DataTemplate SelectTemplate(object item, DependencyObject container)
        {
            Data data = item as Data;
            if (data != null)
            {
                if (data.ShowLineThree)
                {
                    return this.Second;
                }
                else
                {
                    return this.First;
                }
            }
    
            return base.SelectTemplate(item, container);
        }
    }
    
    public class Data
    {
        public string LineOne
        {
            get;
            set;
        }
    
        public string LineTwo
        {
            get;
            set;
        }
    
        public string LineThree
        {
            get;
            set;
        }
    
        public bool ShowLineThree
        {
            get;
            set;
        }
    }
    

    您的 xaml 将如下所示

    <!--ContentPanel contains LongListSelector and LongListSelector ItemTemplate. Place additional content here-->
        <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
            <phone:LongListSelector x:Name="MainLongListSelector" Margin="0,0,-12,0" >
                <phone:LongListSelector.ItemTemplate>
                    <DataTemplate>
                        <local:CustomTemplateSelector Content="{Binding}">
                            <local:CustomTemplateSelector.First>
                                <DataTemplate>
                                    <StackPanel Orientation="Vertical"  Width="400" Margin="10">
                                        <TextBlock Text="{Binding LineOne}" />
                                        <TextBlock Text="{Binding LineTwo}" />
                                    </StackPanel>
                                </DataTemplate>
                            </local:CustomTemplateSelector.First>
                            <local:CustomTemplateSelector.Second>
                                <DataTemplate>
                                        <StackPanel Orientation="Vertical">
                                            <TextBlock Text="{Binding LineOne}"/>
                                            <TextBlock Text="{Binding LineTwo}" />
                                            <TextBlock Text="{Binding LineThree}" />
                                        </StackPanel>
                                </DataTemplate>
                            </local:CustomTemplateSelector.Second>
                        </local:CustomTemplateSelector>
                    </DataTemplate>
                </phone:LongListSelector.ItemTemplate>
            </phone:LongListSelector>
        </Grid>
    

    下面是代码

    this.MainLongListSelector.ItemsSource = new List<Data>
                                  {
                                      new Data{ LineOne = "1", LineTwo = "2", LineThree = "3", ShowLineThree = true },
                                      new Data{ LineOne = "4", LineTwo = "5", LineThree = "6", ShowLineThree = false }
                                  };
    

    希望对你有帮助

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多