如何在WPF UI中使<UIElement>可交互或可点击

6
这是我使用WPF设计UI的第一天。我查阅了MSDN官方文档中的Flow Document,发现可以将UI控件放在RichTextBox中。我尝试将按钮放进去,但发现它不能交互 - 我无法点击它,因为它是灰色的。我也尝试了其他控件,它们都能正常显示,但不支持交互。即使是超链接也不起作用。
我在互联网上搜索过,最接近的问题是如何使内部超链接可点击:类似的问题:C# WPF Text with links 我做了同样的事情,但没有成功!所有组件都正常显示,但无法点击。
这是我的XAML代码:
        <RichTextBox Grid.Row="1" Margin="14.007,31.067,22.011,46.305" Name="rtxtRslt" BorderBrush="White" >
        <FlowDocument>
            <Section FontSize="15">
                <Paragraph>
                    <Bold>Click on this:</Bold>
                    <Italic><Hyperlink  NavigateUri="http://stackoverflow.com">http://www.jxitc.info</Hyperlink></Italic>

                </Paragraph>

                <BlockUIContainer>
                    <Button Click="Button_Click">Also Click On This</Button>
                </BlockUIContainer>
            </Section>
        </FlowDocument>
    </RichTextBox>

请问有没有人能给我一些建议: 1. 是否可以使它可点击 2. 如果可以,如果我忘记设置 RichTextBox 控件的任何/哪些属性?

1个回答

11

首先回答你的直接问题:如何使RichTextBox的内容“活跃”。请将IsDocumentEnabled属性设置为True,就像这里所示:

   <RichTextBox Grid.Row="1" Margin="14.007,31.067,22.011,46.305" Name="rtxtRslt" BorderBrush="White" 
                    IsDocumentEnabled="True">
        <FlowDocument>
            <Section FontSize="15">
                <Paragraph>
                    <Bold>Click on this:</Bold>
                    <Italic>
                        <Hyperlink  NavigateUri="http://stackoverflow.com">http://www.jxitc.info</Hyperlink>
                    </Italic>

                </Paragraph>

                <BlockUIContainer>
                    <Button Click="Button_Click" >Also Click On This</Button>
                </BlockUIContainer>
            </Section>
        </FlowDocument>
    </RichTextBox>

现在来回答一个未提及的问题:你是否必须一定要在 RichTextBox 中使用呢?事实上,RichTextBox 有一个特殊的属性可以使嵌入的 UI 元素处于激活状态,这表明这不是该控件的正常用法。它的目的是用于托管可编辑的 FlowDocument 内容。因此,RichTextBox 的用户通常会 创建 托管按钮的文档,而文档的 使用者则可以单击该按钮 ,如果这有助于区分的话我不知道。 然而,所有这些都说了之后,将您的 FlowDocument 放在简单的 FlowDocumentPageViewer 中,它默认是处于激活状态的。

 <FlowDocumentPageViewer>
        <FlowDocument>
            <Section FontSize="15">
                <Paragraph>
                    <Bold>Click on this:</Bold>
                    <Italic>
                        <Hyperlink NavigateUri="http://stackoverflow.com">http://www.jxitc.info</Hyperlink>
                    </Italic>

                </Paragraph>

                <BlockUIContainer>
                    <Button Click="Button_Click" >Also Click On This</Button>
                </BlockUIContainer>
            </Section>
        </FlowDocument>

    </FlowDocumentPageViewer>

现在,回答另一个未明说的问题(是不可言说的吗?):你是否需要一直处于 FlowDocument 内容中?FlowDocument 内容类似于 UIElement,但不是从它派生而来。因此,许多 UIElement 的开箱即用功能都不可用。如果您需要 UI 中的文档功能,FlowDocuments 可以提供很好的起点,但它们本身也带来了相当大的学习曲线。

如果按照字面意思解读您的问题标题,我认为您可能只想要一个 WPF UI,允许您嵌入按钮和超链接,并使它们工作(惊讶)。这当然是默认行为。如果您不需要 FlowDocument 提供的文档外观和感觉,也不需要 RichTextBox 提供的实时文档编辑功能,那么您可以考虑更“传统”的 WPF 布局。

 <StackPanel Orientation="Vertical" HorizontalAlignment="Stretch"
                Margin="20">
        <TextBlock>
                    <Bold>Click on this:</Bold>
                    <Italic>
                        <Hyperlink NavigateUri="http://stackoverflow.com">http://www.jxitc.info</Hyperlink>
                    </Italic>
        </TextBlock>
        <Button Click="Button_Click" 
                Margin="0,20,0,0">Also Click On This</Button>
    </StackPanel>

哈哈,太棒了!你不仅解决了我的问题,还回答了真正但未明言的问题!是的,我问这个问题部分原因是想知道如何使它变为活动状态。但除此之外,我打算做的是在表单中显示格式化文本(忘记 <UIElements>,我只关心超链接是否可以交互 :D)。因此,你的进一步建议解决了我的问题!谢谢!! - JXITC
你有什么想法可以在WPF中使用基本的HTML来代替使用复杂的流文档呢?可能可以使用类似"HTML-Viewer-Control"的控件吗? - JXITC

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接