Удалить пробелы между элементами C # Flowdocument? - PullRequest
2 голосов
/ 01 февраля 2012

Я хотел бы иметь возможность удалять пробелы между различными встроенными элементами FlowDocument.Ниже приведен очень конкретный пример, чтобы прояснить проблему.Желаемый вывод "Hello World?"но что происходит, «Hello World?».В этом случае "?"является нажимаемой кнопкой.

Я искал некоторое время безуспешно.Я испробовал все формы регулировки пэдов / полей, но они могут только увеличить интервал.Я начинаю верить, что пространство присуще границам элементов FlowDocument.Это похоже на ограничение серии.

<RichTextBox>
  <FlowDocument>
    <Paragraph Margin="0">
      <Run>
        Hello World
      </Run>
      <InlineUIContainer>
        <Button Click="ButtonClick">?</Button>
      </InlineUIContainer>
    </Paragraph>
  </FlowDocument>
</RichTextBox>

Ответы [ 3 ]

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

Каким бы уродливым не показалось форматирование, в XAML на основе XML, если вы хотите избежать пробелов между запусками, вы не можете допустить пробела между тегами close и open элементов. Попробуйте это:

<RichTextBox>
  <FlowDocument>
    <Paragraph Margin="0">
      <Run>
         Hello World
       </Run><InlineUIContainer>
           <Button Margin="0" >?</Button>
       </InlineUIContainer>
    </Paragraph>
  </FlowDocument>
</RichTextBox>
2 голосов
/ 25 июля 2012

Хорошо, эта проблема из-за специальных правил обработки пробелов.

Идея решения : Предварительная обработка xaml, удаляющая новые строки / пробельные символы между тегами.

Осуществление

  1. Переместите ваш абзац в ResourceDictionary (например, Strings.xaml).
  2. Установите для параметра «Build Action» для Strings.xaml значение «Resource» (чтобы оно сохранялось как текст, а не как двоичный файл).
  3. Загрузите его, удалите пробелы, используя следующий код:

    var uri = @"pack://application:,,,/YourProjectName;component/PathToDictionary/Strings.xaml";
    var resourceInfo = Application.GetResourceStream(uri);
    using (var xmlReader = new XmlTextReader(resourceInfo.Stream) { WhitespaceHandling = WhitespaceHandling.None})
    {                    
        var xamlReader = new System.Windows.Markup.XamlReader();                    
        dictionary = (ResourceDictionary)xamlReader.LoadAsync(xmlReader);
    }
    
  4. Добавить словарь ресурсов к ресурсам объекта, который должен использовать Абзац:

    MyControl.Resources.MergedDictionaries.Add(dictionary);
    
  5. Вот и все, никаких дополнительных прогонов с пробелами внутри не будет.

Я использую нашего собственного настраиваемого локализуемого потомка ResorceDictionary, который имеет возможность удалять пробелы и обрабатывает все это автоматически.

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

Вы можете добавить к кнопке отрицательные поля, чтобы она подходила ближе:

<InlineUIContainer><Button Margin="-3,0">?</Button></InlineUIContainer>
...