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