我需要做什么才能让下面的内部 TextBlock 在不定义绝对宽度的情况下换行其文本?
我尝试过 Width=Auto、Stretch、TextWrapping,将其放入 StackPanel 中,似乎没有任何效果。

(来源:deviantsart.com)
XAML:
<UserControl x:Class="Test5.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:tk="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Toolkit"
Width="800"
Height="600">
<tk:DockPanel LastChildFill="True">
<StackPanel tk:DockPanel.Dock="Top"
Width="Auto"
Height="50"
Background="#eee">
<TextBlock Text="{Binding TopContent}"/>
</StackPanel>
<StackPanel tk:DockPanel.Dock="Bottom" Background="#bbb"
Width="Auto"
Height="50">
<TextBlock Text="bottom area"/>
</StackPanel>
<StackPanel tk:DockPanel.Dock="Right" Background="#ccc"
Width="200"
Height="Auto">
<TextBlock Text="info panel"/>
</StackPanel>
<StackPanel tk:DockPanel.Dock="Left" Background="#ddd"
Width="Auto"
Height="Auto">
<ScrollViewer HorizontalScrollBarVisibility="Auto" Padding="10"
BorderThickness="0"
Width="Auto"
VerticalScrollBarVisibility="Auto">
<tk:DockPanel HorizontalAlignment="Left" Width="Auto" >
<StackPanel tk:DockPanel.Dock="Top" HorizontalAlignment="Left">
<Button Content="Add More" Click="Button_Click"/>
</StackPanel>
<TextBlock tk:DockPanel.Dock="Top"
Text="{Binding MainContent}"
Width="Auto"
TextWrapping="Wrap" />
</tk:DockPanel>
</ScrollViewer>
</StackPanel> …Run Code Online (Sandbox Code Playgroud) 我目前正在为Windows Phone Seven编写电子书阅读器,我正试图像Kindle阅读器那样设计它.为了做到这一点,我需要将我的书分成页面,当添加可变字体大小时,这将变得更加复杂.
为了做到这一点,我只是一次在文本块中添加一个单词,直到它变得高于其容器.但是你可以想象,有一个超过120,000字的文件,这需要一段不可接受的时间.
有没有一种方法可以找出文本何时超出界限(逻辑上将其划分为页面),而不必实际呈现它?这样我就可以在后台线程中运行它,这样用户可以在此期间继续阅读.
到目前为止,我发现的唯一想法是找出文本块如何决定其边界(在度量调用中?),但我不知道如何找到该代码,因为反射器没有显示任何内容.
提前致谢!
我在wpf TextBlock控件(.Net 3.5)中呈现文本.文本块的内容取决于用户在列表框中选择的内容.文本换行,所以我不需要水平滚动条.但是,文本通常比窗口显示的数量多,所以我需要一个垂直滚动条.
当我开始搜索时,我很快发现答案是将TextBlock包装在ScrollViewer中.然而,它不起作用(TM),我希望有人可以帮助我找出原因.
这是UI代码的结构:
<Window x:Class=..>
<StackPanel>
<ListBox HorizontalAlignment="Stretch"
VerticalAlignment="Top" Height="200"
SelectionChanged="listbox_changed" SelectionMode="Single">
</ListBox>
<Button Click="Select_clicked">Select</Button>
<ScrollViewer VerticalScrollBarVisibility="Auto">
<TextBlock Name="textblock" TextWrapping="Wrap"/>
</ScrollViewer>
</StackPanel>
</Window>
Run Code Online (Sandbox Code Playgroud)
当用户选择列表框中的项目时,与该项目关联的某些文本将显示在TextBlock中.我原以为代码应该是所有必需的代码,但它从来没有为我提供滚动条.
搜索和试验给了我两条线索:问题的根源可能与我动态更新TextBlock的内容有关,而TextBlock不会根据新内容调整自身大小.我找到了一个似乎相关的帖子,通过将TextBlock的高度设置为其ActualHeight(在更改其内容之后),它会起作用.但它没有(我看不出这个效果).
其次,如果我设置ScrollViewer的高度(在设计时间内),那么我会得到一个垂直滚动条.例如,如果我在上面的xaml中将它设置为300,结果几乎是好的,因为第一次打开的窗口包含一个带有垂直滚动条的TextBlock(当且仅当我需要它时).但是如果我让窗口变大(在运行时使用鼠标调整窗口大小),ScrollViewer不会利用新的窗口大小,而是根据xaml保持其高度,这当然不会.
希望,我只是忽略了一些明显的东西......
谢谢!
编辑:我想这个问题没有说清楚.它实际上由4个独立的组成:
TextBlock如果客户端应用程序不以编程方式或通过xaml提供任何样式,如何获取其默认颜色? Label获得其默认颜色?TextBlock如果客户端应用程序不以编程方式或通过xaml提供任何样式,如何获取其默认字体大小和字体系列?Label获得其默认字体大小和字体系列?顺便说一下,问题不在于如何更改或定义a TextBlock或a 的颜色/字体大小/字体系列的样式Label,尽管它们在某种程度上是相关的.我想我已经知道了#2的答案,这是Label从SystemColors.ControlTextBrushKey得到它的颜色,并通过覆盖ConrolTextBrushKey如下:
<SolidColorBrush x:Key="{x:Static SystemColors.ControlTextBrushKey}" Color="Red"/>
Run Code Online (Sandbox Code Playgroud)
你可以"全局"改变Labels的颜色.经过一番研究,我想我也找到了#1的答案是:TextBlock继承从含有其它的前景色Window,在默认情况下得到的Foreground,从颜色SystemColors.WindowTextBrushKey.通过为WindowTextBrush定义颜色,如下所示:
<Window.Resources>
<SolidColorBrush x:Key="{x:Static SystemColors.WindowTextBrushKey}"
Color="Yellow"/>
</Window.Resources>
Run Code Online (Sandbox Code Playgroud)
您可以更改TextBlock内部s 的"前景"颜色Window.
问题#3和#4对我来说仍然是难题,但我假设它们与SystemFonts有关.
希望这是有道理的.我真的很想知道答案,因为他们一直在困扰我.非常感谢!
以下是原帖:
如果您查看LabelWindows附带的主题中的a样式(例如"aero.normalcolor.xaml"),您可以找到
<Setter Property="Foreground"
Value="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}"/>
Run Code Online (Sandbox Code Playgroud)
哪个设置了颜色Label.但是FontSize在样式中没有指定属性的位置,我认为这与SystemFonts有关.对于a TextBlock,它看起来更神秘,因为它在"aero.normalcolor.xaml"中的样式只有4行:
<Style x:Key="{x:Type TextBlock}"
TargetType="{x:Type TextBlock}">
<Setter …Run Code Online (Sandbox Code Playgroud) 我有FixedDocument页面,我想TextBlock放在它上面,但它可能Textblock不适合页面的高度。
所以我想从繁重的产生线TextBlock带TextWrapping,然后创建新的TextBlock,即通过安装高度,并把它页。
TextBlock有LineCount私有财产,这意味着它TextLines在包装后有,我可以以某种方式得到它。使用运行
创建TextBlock:
public TextItem(PageType pageType, Run[] runs, Typeface typeFace, double fontSize)
: base(pageType)
{
this.TextBlock = new TextBlock();
this.TextBlock.Inlines.AddRange(runs);
if (typeFace != null)
this.TextBlock.FontFamily = typeFace.FontFamily;
if (fontSize > 0)
this.TextBlock.FontSize = fontSize;
this.TextBlock.TextWrapping = TextWrapping.Wrap; //wrapping
}
Run Code Online (Sandbox Code Playgroud)
TextBlock用文本创建:
public TextItem(PageType pageType, String text, Typeface typeFace, double fontSize)
: base(pageType)
{
if (typeFace == null || fontSize == …Run Code Online (Sandbox Code Playgroud) 我想在 XAML 中显示今天的日期,然后将其返回到我的视图模型。所以这在 XAML 中显示
<TextBlock Text="{Binding Source={x:Static sys:DateTime.Now}, StringFormat=dd/MMM/yyyy}"/>
Run Code Online (Sandbox Code Playgroud)
但我想在 ModifiedDate 中返回它,所以我这样做了
<TextBlock x:Name="ModifiedDate" Text="{Binding Source={x:Static sys:DateTime.Now}, StringFormat=dd/MMM/yyyy}"/>
Run Code Online (Sandbox Code Playgroud)
这不起作用。我不想使用日期选择器。我想使用 Pure XAML 并且不想去编码。有任何想法吗?
是否有可能在XAML定义多Run一个内部的Style制定者?
以下两个已Run定义并失败:
物业'价值'不止一次设定.
<TextBlock>
<TextBlock.Style>
<Style TargetType="{x:Type TextBlock}">
<Setter Property="Text">
<Setter.Value>
<Run Text="{Binding SelectedItem.iso}"/>
<Run Text="{Binding SelectedItem.value}"/>
</Setter.Value>
</Setter>
<Style.Triggers>
<DataTrigger Binding="{Binding SelectedItem.type}" Value={x:Null}">
<Setter Property="Text" Value="No value" />
</DataTrigger>
</Style.Triggers>
</Style>
</TextBlock.Style>
</TextBlock>
Run Code Online (Sandbox Code Playgroud)
这可以修复,同时保留多个的使用Run?
aTextBlock在 aButton里面content。
我想要Text的财产TextBlock。请告知我如何解决这个问题。
下面的代码仅返回ct为System.Windows.Controls.TextBlock
string ct = (sender as Button).Content.ToString();
Run Code Online (Sandbox Code Playgroud)
当然,这Content确实Button是TextBlock System.Windows.Controls.TextBlock
我在 stackoverflow 中发现的非常相似的案例,但人们只提供了错误的答案。
我正在向a 中的元素添加一些TextBlock元素。我正在通过添加.BorderStackPanelTextBlockInlines
单击时,我想获取TextBlock.Here 是我的代码的格式化文本。
public void addText()
{
TextBlock myText = new TextBlock();
myText.Inlines.Add(new Bold(new Run("Hello ")));
myText.Inlines.Add("World!");
Border myBorder = new Border();
myBorder.Child = myText;
myBorder.MouseDown += new MouseButtonEventHandler(Border_Clicked);
myStackPanel.Children.Add(myBorder);
}
private void Border_Clicked(object sender, MouseButtonEventArgs e)
{
//Border senderBox = (Border)sender;
//TextBlock senderText = (TextBlock)senderBox.Child;
//Bold inline = (Bold) senderText.Inlines.ElementAt(0);
// How to Output "Hello "?
}
Run Code Online (Sandbox Code Playgroud)
Border_Clicked应该输出“你好”。正如您所看到的,我可以访问粗体文本,但如何输出它?
考虑以下 XAML:
<Grid>
<TextBlock Text="Some Text" TextAlignment="Right" />
<TextBlock Text="Some Text" HorizontalAlignment="Right" />
</Grid>
Run Code Online (Sandbox Code Playgroud)
只要两个TextBlocks 设置为相同的Grid.Row和Grid.Column,它们将始终出现在相同的位置 - 一个在另一个之上。
类似的概念,这里 - 两个 s 中的两行文本StackPanel完全对齐:
<Grid>
<StackPanel>
<TextBlock Text="Line One" HorizontalAlignment="Right" />
<TextBlock Text="Line Two" TextAlignment="Right" />
</StackPanel>
<StackPanel>
<TextBlock Text="Line One" HorizontalAlignment="Right" />
<TextBlock Text="Line Two" TextAlignment="Right" />
</StackPanel>
</Grid>
Run Code Online (Sandbox Code Playgroud)
等等...
就在父级右侧显示文本而言,TextAlignment和HorizontalAlignment属性都在做同样的事情 - 从我所看到的。
TextAlignment有人能告诉我 s和sHorizontalAlignment之间的实际区别是什么吗TextBlock?
两者有优先选择吗?
使用这两者有什么影响吗?