C# 在Windows Phone 8中以编程方式将文本框置于网格中

C# 在Windows Phone 8中以编程方式将文本框置于网格中,c#,xaml,windows-phone-8,grid,C#,Xaml,Windows Phone 8,Grid,如何以编程方式在网格中放置文本块。这是我的XAML代码: 我需要添加文本块,它是通过编程实现的。 有一个SetRow方法,但ContentPanel或LayoutRoot中不存在该方法,仅用于网格控件(这指的是哪个网格?) 此外,我似乎无法访问项目网格,这是因为它位于stackpanel内吗? 如何解决这个问题?我需要做的是将textblock放置在网格中的特定行中,网格位于stackpanel和datatemplate中。 有什么办法吗 谢谢, 贾尼 不确定它是否适合您的场景,但您可以将Tex

如何以编程方式在网格中放置文本块。这是我的XAML代码: 我需要添加文本块,它是通过编程实现的。 有一个SetRow方法,但ContentPanel或LayoutRoot中不存在该方法,仅用于网格控件(这指的是哪个网格?) 此外,我似乎无法访问项目网格,这是因为它位于stackpanel内吗? 如何解决这个问题?我需要做的是将textblock放置在网格中的特定行中,网格位于stackpanel和datatemplate中。 有什么办法吗

谢谢, 贾尼


不确定它是否适合您的场景,但您可以将
TextBlock
保留为未注释状态,但将
可见性设置为
可见性。如下所示:

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

然后在代码中键入
MyTextBlock.Visibility=可见性.Visibility


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

因此,要添加的文本块位于stackpanel中的网格中,stackpanel是LongListSelector数据模板的一部分。因此,我们在这里讨论的是动态修改数据模板的能力

一种解决方案是使用自定义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 }
                              };
this.MainLongListSelector.ItemsSource=新列表
{
新数据{LineOne=“1”,LineTwo=“2”,LineThree=“3”,ShowLineThree=true},
新数据{LineOne=“4”,LineTwo=“5”,LineThree=“6”,ShowLineThree=false}
};

希望这有帮助

谢谢,这可能会很棘手,因为我实际上使用的是RichTextBlock,并且文本包含文本和超链接。这就是您使用它的方式,过早单击:我需要动态添加文本并将超链接放置在RichTextBox(而不是块)中的正确位置,这样我就无法在XAML中创建它,然后打开/关闭可见性。Jani-您可以绑定到RichTextBlock中Run的text属性。如果没有添加任何数据,它将只是在RichTextBlock中空白,可以有x个运行元素和超链接元素,例如,如果我有文本:“花很好,狗也很好”,那么“花是”是1个运行,然后如果我想“好”是链接,那就是超链接元素“等等”是第二次跑步,而狗又是一个超链接,因此可以有很多跑步和超链接,因此我无法事先在XAML中创建,并且需要打开/关闭可见性来动态创建它们。至少我是这么看的,如果我错了,请纠正我。听起来DataTemplate不适合。也许最好在代码隐藏中创建每个项,并添加到longlistelector,因为它们非常不同
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 }
                              };