Как сделать ‹UIElement› интерактивным или кликабельным в пользовательском интерфейсе WPF

Это мой первый день разработки пользовательского интерфейса с использованием 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?


person JXITC    schedule 31.01.2012    source источник


Ответы (1)


Прежде всего, ваш прямой вопрос: как сделать содержимое 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>
person TheZenker    schedule 01.02.2012
comment
Ха-ха! отличный ответ! Вы не только решили мою проблему, но и ответили на настоящую, но невысказанную проблему! Да, я задаю этот вопрос частично потому, что я просто хочу знать, как сделать его активным. Но помимо этого, то, что я собираюсь сделать, это отобразить форматированный текст в форме (забудьте об ‹UIElements›, меня волнует только то, может ли гиперссылка взаимодействовать :D). Поэтому ваше дальнейшее предложение решило мою проблему! Спасибо!! - person JXITC; 01.02.2012
comment
И есть ли у вас какие-либо идеи, могу ли я использовать базовый HTML в каком-то HTML-Viewer-Control в WPF вместо использования такого сложного потокового документа. - person JXITC; 01.02.2012