如何更换'';边界

本文关键字:边界 何更换 | 更新日期: 2023-09-27 18:19:31

我有一个string,它存储带有"?"的不同字符串在多个不同的地方:

示例1

string question = "4 + ? = 7";

示例2

string question = "5 + 5 = ?";

然后将string添加到我的TextBlock

question_txt.Text = question;

我想要"?"用边界代替,所以它将只是一个黑色轮廓的正方形,其中的"?"应该是。

这样做可能吗?

如何更换'';边界

我理解的问题:

你正在做一个算术游戏。假设输出如下所示。

  1. 一个方程式来了。喜欢4+?=7.或4+3=
  2. 用户将替换"?"用恰当的答案做标记
  3. 如果答案正确,则进入下一个问题。可能有要点或其他策略

在这种情况下:

你会有一个问题列表,我想这就是你提到的一连串的问题。程序必须回答每个问题,向用户显示您想要如何显示(文本框中的?)。

所以你必须找到为每个字符串动态标记,并将其设置为一个文本框,其他部分将在一个或两个文本块中。

步骤:

  1. 遍历你的字符串集合。列表可以是
  2. foreach项,按"?"拆分
  3. 然后你会在字符串[]中找到2个字符串,如果只有一个"?"在一个方程式中
  4. 如果第二个字符串为空(stringIsNullOrEmpty),则在textblock1中分配字符串[0],并在textbox1中分配"?"
  5. 如果第二个字符串不为null或为空,则在第一个标签1中分配字符串[0],在文本框1中分配"?",在标签2中分配字符串[1]
  6. 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>