Как сделать <UIElement>интерактивным или кликабельным в интерфейсе WPF - PullRequest
5 голосов
/ 31 января 2012

Это мой первый день разработки пользовательского интерфейса с использованием WPF.Я просмотрел официальный документ MSDN Flow Document и обнаружил, что могу поместить элемент управления пользовательского интерфейса в RichTextBox .Я вставил кнопку, но обнаружил, что она не взаимодействует - я не могу нажать на нее, поскольку она сераяИ я также пробовал другие элементы управления, и все они отображались нормально, но просто не поддерживают взаимодействие.Даже гиперссылка не работает.

Я искал по интернету, самый близкий вопрос, который когда-либо задавался, о том, как сделать внутреннюю гиперссылку доступной для кликов: Аналогичный вопрос: C # WPF Текст со ссылками

Я сделал то же самое, но это не сработало!Все компоненты отображаются хорошо, но не могут быть нажаты.

Вот мой 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 Ответ

9 голосов
/ 01 февраля 2012

Прежде всего, ваш прямой вопрос: как сделать содержимое RichTextBox "активным". Установите для свойства IsDocumentEnabled значение True для RichTextBox, как показано здесь:

   <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 есть специальное свойство, позволяющее сделать встроенные элементы пользовательского интерфейса активными, указывает на то, что это ненормальное использование для этого элемента управления. Он предназначен для размещения редактируемого содержимого 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. Таким образом, многие из готовых функций UIElements недоступны. Если вам нужна функциональность документа в пользовательском интерфейсе, FlowDocuments может обеспечить отличное начало, но принесет с собой довольно большую кривую обучения.

Название вашего вопроса, если его понимать буквально, заставляет меня думать, что вы, возможно, просто хотите, чтобы пользовательский интерфейс WPF позволял вставлять кнопки и гиперссылки и заставить их работать (задыхаться). Это, безусловно, поведение по умолчанию. Если вам не нужен внешний вид документа, который обеспечивает 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>
...