如何更换'';边界
本文关键字:边界 何更换 | 更新日期: 2023-09-27 18:19:31
我有一个string
,它存储带有"?"的不同字符串在多个不同的地方:
示例1
string question = "4 + ? = 7";
示例2
string question = "5 + 5 = ?";
然后将string
添加到我的TextBlock
中
question_txt.Text = question;
我想要"?"用边界代替,所以它将只是一个黑色轮廓的正方形,其中的"?"应该是。
这样做可能吗?
我理解的问题:
你正在做一个算术游戏。假设输出如下所示。
- 一个方程式来了。喜欢4+?=7.或4+3=
- 用户将替换"?"用恰当的答案做标记
- 如果答案正确,则进入下一个问题。可能有要点或其他策略
在这种情况下:
你会有一个问题列表,我想这就是你提到的一连串的问题。程序必须回答每个问题,向用户显示您想要如何显示(文本框中的?)。
所以你必须找到为每个字符串动态标记,并将其设置为一个文本框,其他部分将在一个或两个文本块中。
步骤:
- 遍历你的字符串集合。列表可以是
- foreach项,按"?"拆分
- 然后你会在字符串[]中找到2个字符串,如果只有一个"?"在一个方程式中
- 如果第二个字符串为空(
stringIsNullOrEmpty
),则在textblock1中分配字符串[0],并在textbox1中分配"?" - 如果第二个字符串不为null或为空,则在第一个标签1中分配字符串[0],在文本框1中分配"?",在标签2中分配字符串[1] 6.
您必须动态地执行此操作,并为每次提交结果调用方法。从你的问题来看,你实际上想做什么还不太清楚。答案来自我的看法。
我会使用IValueConverter
,它返回包含一分为二的字符串及其边界的Panel
。
这是代码。首先是完成大部分工作的转换器。
public class StringToContentConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
var question = (string)value;
if (string.IsNullOrWhiteSpace(question))
{
return Binding.DoNothing;
}
//Splitting question in each place where '?' char occurs
var questionSplit = question.Split('?');
var panel = GetPanel();
for (int i = 0; i < questionSplit.Length; i++)
{
//Add current part of the Question
panel.Children.Add(GetTextBlock(questionSplit[i]));
//If there's next part of your question black border is added to panel
//That's usefull if you want to have more than one questionmark in your question
if (i < questionSplit.Length - 1)
{
panel.Children.Add(GetBorder());
}
}
return panel;
}
private Panel GetPanel()
{
var panel = new StackPanel();
panel.Orientation = Orientation.Horizontal;
return panel;
}
private TextBlock GetTextBlock(string text)
{
var textBlock = new TextBlock();
textBlock.Text = text;
return textBlock;
}
private Border GetBorder()
{
var border = new Border();
var style = Application.Current.Resources["CustomBorderStyle"] as Style;
border.Style = style;
return border;
}
//Most likely you won't need converting back since you've got your question on the view model
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotSupportedException();
}
}
现在,您可以看到GetBorder()
从资源中读取样式(您可以直接修改其样式,但我更喜欢外部样式,所以只需将其添加到表单正在使用的ResourceDictionary
中即可(App.xaml中的全局资源也可以完成此工作)。
<Style x:Key="CustomBorderStyle" TargetType="Border">
<Setter Property="Width" Value="10"/>
<Setter Property="Height" Value="20"/>
<Setter Property="Background" Value="Black"/>
</Style>
以下是使用方法。
<Grid>
<Grid.Resources>
<local:StringToContentConverter x:Key="StringToContent" />
</Grid.Resources>
<!-- 'Question' is the property in your DataContext -->
<Label Content="{Binding Question, Converter={StaticResource StringToContent}}"/>
</Grid>