具有可变数量的TextBlocks(使用ItemsControl创建)的WPF RichTextBox会丢失选择行为

时间:2015-04-30 06:40:07

标签: c# .net wpf xaml

我需要在wpf的多行文本框中显示一些内容,其中一些内容,我想显示粗体(或我想要做的任何格式化)。

所以我最终搜索了一个控件,发现RichTextBox可以通过在其中使用Run控件来完成这项工作。像这样:

    <RichTextBox>
        <FlowDocument>
            <Paragraph>
                <Run Text="Text to be displayed in Bold" FontWeight="Bold"/>
                <Run Text="Normal text"/>
            </Paragraph>
        </FlowDocument>
    </RichTextBox>

所以这很好,我可以在这里选择内容,它也有很好的格式。

但现在下一个问题是,这个内容是动态的,我将在viewModel中创建。所以我尝试使用ItemsControl Inside RichTextBox,如下所示:

    <RichTextBox>
        <FlowDocument>
            <Paragraph>
                <ItemsControl ItemsSource="{Binding MyCollections}">
                    <ItemsControl.ItemTemplate>
                        <DataTemplate>
                            <!--< I want to use Run here, so that the content inside textbox is selectable, and I can even do formatting on Run >-->
                            <TextBlock Text="{Binding MyTextInCollection}" />
                        </DataTemplate>
                    </ItemsControl.ItemTemplate>
                </ItemsControl>
            </Paragraph>
        </FlowDocument>
    </RichTextBox>

但我不能在DataTemplate中使用Run(如代码中所示),所以我尝试使用TextBlock。

现在问题是,TextBox应该具有的基本选择行为,现在已经消失了。我想做选择(通过使用Ctrl A,或者单击并拖动鼠标)并且想要复制文本。我现在不能做。

任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:1)

我通过这种方式工作:

在xaml中使用RichTextBox为其命名

<RichTextBox x:Name="MyTextBox" IsReadOnly="True" VerticalScrollBarVisibility="Visible" Margin="5" />

然后在代码隐藏中,我使用paragraph和Run创建文档并将其绑定到RichTextBox,如下所示:

FlowDocument fd = new FlowDocument();
        fd.LineHeight = 1;
        foreach (var item in ((MyViewModel)this.DataContext).MyCollections)
        {
            Paragraph p = new Paragraph(new Run(item.MyTextInCollection) { FontWeight = FontWeights.Bold }); // bold text 
            Paragraph p = new Paragraph(new Run(item.MyTextInCollection)); // text with no formatting
            fd.Blocks.Add(p);
        }
        MyTextBox.Document = fd;

这样我就可以获得内容的格式,以及我需要的选择行为。

我知道我在代码隐藏中而不是在xaml中这样做,但这很好,因为这是我在代码隐藏中所做的纯视图内容,而不是ViewModel中应该存在的业务逻辑

答案 1 :(得分:-1)

这里的标签onClick事件在这种情况下没有给出更喜欢Javascript

IJavaScriptExecutor jspop =(IJavaScriptExecutor)驱动程序;

IWebElement elementpop = driver.FindElement(By.XPath(&#34; html / body / div / ul / div&#34;));

jspop.ExecuteScript(&#34; arguments [0] .click()&#34;,elementpop);