This question already has answers here:
Closed 10 years ago.
Possible Duplicate:
Components Inside Textbox/RichTextbox in DotNet
I have a textbox inside of my RichTextbox control. (The texboxt contains certain expressions that cannot otherwise be done in richtextbox itself.) I am having trouble focusing/navigating into the element when the caret is adjacent to the object. The caret is just skipping over the object. Is there any way to notice the object and focus on to it (in this case focus into the textbox)?
Actually, I should be more specific, the 'textbox' is actually a UserControl that can contain multiple texboxes and other symbols so it's not just a simple wpf 'textbox'. But essentially it behaves like a textbox.
Thanks.
<RichTextBox Name="rtb" Grid.Row="1" >
<ed:EnabledFlowDoc x:Name="efdMath" TextBlock.BaselineOffset="-10"
FontFamily="Palatino Linotype">
<Paragraph TextBlock.BaselineOffset="10" TextInput="Paragraph_TextInput_1">
Text . . .
<InlineUIContainer BaselineAlignment="Center">
<TextBox />
</InlineUIContainer>
<InlineUIContainer BaselineAlignment="Center">
<TextBox />
</InlineUIContainer>
</Paragraph>
</ed:EnabledFlowDoc>
</RichTextBox>
Also you can use IsDocumentEnabled="True" Property of RichTextBox.
The function I was looking for is this . . .
RichTextBox.CaretPosition.GetAdjacentElement(LogicalDirection Direction)
for more information, look at my newer post since i cannot delete this old post . . .
Components Inside Textbox/RichTextbox in DotNet
It can be done by override IsEnabledCore property of FlowDocument:
class EnabledFlowDoc : FlowDocument
{
protected override bool IsEnabledCore
{
get
{
return true;
}
}
}
find this solution here
Related
This question already has answers here:
Button template with image and text in wpf
(7 answers)
Closed 8 years ago.
I am creating one sample WPF-MVVM application , in that I have one image which indicates '+' sign and I have a button with content 'Edit'. Now I have to show the image along with Name 'Edit' on a button. Please let me know the solution for this problem.
EDIT
here I am able to show the image but the name is appered below the image. But I want to show the name beside the image.
you can do something like this
<Button Margin="104,78,84,60" Name="button1" Height="100" Width="200">
<StackPanel Orientation="Horizontal">
<Image Source="ssv.png" Stretch="None" Height="50" Width="50" />
<TextBlock TextAlignment="Center">Text value for this.</TextBlock>
</StackPanel>
</Button>
There are a few ways you could create an 'image button', one way would be to create a custom which derives from Button and adds an Image property, or a user control that uses a Button and declaratively adds the image as part of the buttons's control template in the user control XAML.
However, these approaches mean that the layout of the image within the button is fixed, so it isn't particularly flexible.
A nicer option is to create an attached property which stores the image location, and then reference this attached property value in the buttons control template. You can then create a style for the control template to make the layout reusable across buttons.
I am working with Silverlight 4 and trying to put my test apps multilingual but I am having some trouble when I arrive to the "RichTextBox" control. I am able to bind it properly by doing back-code (c#), but when trying using the "DataContext" attributes I am not able to load it at all.
I have created a FormatConverter that return a Block (paragraph) for testing and my code where I have my RichTextBox looks like:
<RichTextBox x:Name="rtaTest" BorderThickness="0" IsReadOnly="True" UseLayoutRounding="True"
DataContext="{Binding Source={StaticResource Localization}, Path=Home.MainContent, Converter={StaticResource ParagraphFormatConverter}}">
</RichTextBox>
I am wondering if there is a way of binding a RichTextBox from the XAML.
Run seems to support databinding in SL4, as in:
<RichTextBox>
<Paragraph>
<Run Text="{Binding Path=LineFormatted}" />
</Paragraph>
</RichTextBox>
I think you may be a little confused about the used of the DataContext. You might for example have some Rich text where some children of one or more InlineUIContainer elements may retrieve their text from a property of some object. You would assign the object to the DataContext.
Whilst I'm not quite sure what you were expecting to achieve but I suspect that what you really need is for your converter to actually return a BlocksCollection (even if it just contains the single Block you were originaly returning) and then to bind as:-
<RichTextArea x:Name="rtaTest" BorderThickness="0" IsReadOnly="True"
UseLayoutRounding="True"
Blocks="{Binding Source={StaticResource Localization},
Path=Home.MainContent, Converter={StaticResource ParagraphFormatConverter}}" />
This FillFromXml is a WPF thing? Don't see it in Silverlight.
Blocks cannot be set, they can only be fetched. One way to set the blocks for a RichTextArea is
public static void UpdateRichTextArea(RichTextArea area, string xmlText)
{
if (area == null)
return;
area.Blocks.FillFromXml(xmlText, true);
}
I have created a custom TaskButton control that takes an image and text. The properties are set like this:
<custom:TaskButton Text="Calendar" ImagePath="Images/calendar.png" ... />
My custom control class implements Text and ImagePath properties, and the control template for the custom control (in Themes\Generic.xaml) sets its content like this, using a RelativeSource object to get the image path:
<!-- Button Content -->
<StackPanel>
<Image Source="{Binding Path=ImagePath, RelativeSource={RelativeSource TemplatedParent}}" Width="24" Height="24" Stretch="Fill" Margin="10,0,0,0" />
<TextBlock Text="{TemplateBinding Text}" HorizontalAlignment="Center" VerticalAlignment="Center" FontFamily="Segoe UI" FontWeight="Bold" Margin="6,0,10,0" Foreground="Black" />
</StackPanel>
The control works fine in most cases, but in a particular project, the relative path to the button's image does not get resolved correctly, and the button image is not displayed. Here is what I have figured out so far:
I am entering the path correctly when I use the custom control. If I place an image control on the same design surface with the same relative path, it is resolved correctly.
The problem is with the relative path. If I replace the relative path with an absolute path, the path is resolved correctly and the image is displayed.
As I mentioned above, the control works fine in most cases. The one case where it isn't working is a Prism 2.1 project, where the control is instantiated on a user control in a Prism module. The module is a simple class library, but it has all of the references of a WPF project.
Any idea why the relative path would fail? Thanks in advance for your help.
I finally figured out the problem. It was actually in the C# backing class for my control. I declared an ImagePath property as a string, since that was how I was going to specify the image. Oops--bad call on my part. That property should actually be an ImageSource property, not a string. WPF has a built-in ImageSourceConverter class that will resolve the path and return the specified image. So, I simply changed the property name from ImagePath to Image, and changed its type from string to ImageSource. That solved the problem.
Thanks to Aviad P. for taking a crack at this. It was unsolvable without the C# code showing the property declarations. I'll post all code and markup next time.
Is there any way to use databinding to show or hide a Paragraph within a FlowDocument? (I want to use MVVM, but with a FlowDocument as my view.)
Paragraph doesn't have a Visibility property. I'm not sure what else to look for.
I tried Chris Bova's answer, but it had a couple problems:
Text selection didn't work right
The text inside didn't flow like a paragraph
My solution was to add and remove the paragraph from the flow document.
The steps are:
Name the flow document (ie flowDocument)
Name the item before the paragraph you want to hide (ie previousBlock)
Name the paragraph you want to hide (ie hideParagraph)
Then:
if (<hide paragraph>)
{
if (previousBlock.NextBlock == hideParagraph)
{
flowDocument.Blocks.Remove(hideParagraph);
}
}
else
{
if (previousBlock.NextBlock != hideParagraph)
{
flowDocument.Blocks.InsertAfter(previousBlock, hideParagraph);
}
}
I had the exact same problem and handled it successfully by wrapping the content of the ListItem in a InlineUIContainer, like so:
<ListItem>
<Paragraph>
<InlineUIContainer>
<TextBlock x:Name="HideMe" Visibility="Collapsed">
<Hyperlink NavigateUri="...">Components</Hyperlink>
</TextBlock>
</InlineUIContainer>
</Paragraph>
</ListItem>
From here you can set the visbility of "HideMe" in code or through a binding.
Options I can think of...
Hide the content of the paragraph (don't include the paragraph in your model)
Extend Paragraph (or one of its base classes) and provide a dependency property for IsVisible
Set fontsize to 0.004. You can use a style data trigger if necessary.
I have two projects. One is working and the other isn't however the differences between them is nothing that I think "should" be of any importance. The first project is the one that is broken and it is the one I am trying to fix. The second project is a little sample project that I created when the first project just won't work at all. Of course the sample works perfectly.
Here is the view for the first project. I have removed a bunch of the "MainWindowTabControlStyle" because it is just the combo box that is broken. I am reasonable certain that the issue is not in the style because it is a copy and paste from the project that is working.
<Grid>
<TabControl Style="{DynamicResource MainWindowTabControlStyle}">
<TabItem Header="Tab 1"/>
<TabItem Header="Tab 2"/>
</TabControl>
</Grid>
<Style x:Key="MainWindowTabControlStyle" TargetType="{x:Type TabControl}">
...
<ComboBox
HorizontalAlignment="Right"
VerticalAlignment="Top"
IsSynchronizedWithCurrentItem="True"
ItemsSource="{Binding Path=Subscriptions, Mode=Default}"
SelectedItem="{Binding Path=SelectedSubscription, Mode=OneWayToSource}"
ItemTemplate="{DynamicResource SubscriptionsItemTemplate}"/>
...
</Style>
<DataTemplate x:Key="SubscriptionsItemTemplate">
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding Path=DisplayName, Mode=Default}"/>
</StackPanel>
</DataTemplate>
Here is the view model that is set to the DataContext of the MainWindow. The ViewModelBase class is the exact same code that Josh Smith wrote in this months MSDN article.
public sealed class MainWindowViewModel : ViewModelBase
{
public MainWindowViewModel()
{
}
private ObservableCollection<Subscription> subscriptions;
public ObservableCollection<Subscription> Subscriptions
{
get
{
if (subscriptions == null)
{
subscriptions = new ObservableCollection<Subscription>();
subscriptions.Add(new Subscription() { DisplayName = "ABC" });
subscriptions.Add(new Subscription() { DisplayName = "XYZ" });
subscriptions.Add(new Subscription() { DisplayName = "PDQ" });
}
return subscriptions;
}
set { subscriptions = value; }
}
private Subscription selectedSubscription;
public Subscription SelectedSubscription
{
get { return selectedSubscription; }
set { selectedSubscription = value; }
}
}
When I run the project from the debugger the first think that is called is the getter for the Subscriptions collection. Then the setter is called on the SelectedSubscription (it is null). After that I can change the selected item in the combobox till I am blue in the face and the setter for the SelectedSubscription property doesn't get changed again. It is important to note that the combobox does contain the correct values.
In the second project the code is identical but the first thing that is called is the setter for the SelectedSubscription property (it is null) then the getter for the Subscriptions collection is called and finally the setter for the SelectedSubscription is called a second time and it has a value that matches the first item in the Subscriptions collection.
This little jewel has cost me about 5 hours if you have any ideas at all I am willing to try it.
Thanks
Possibly change
SelectedItem="{Binding Path=SelectedSubscription, Mode=OneWayToSource}"
to
SelectedItem="{Binding Path=SelectedSubscription, Mode=TwoWay}"
Sorry about the delay in getting an answer posted. There was some kind of issue with getting an Open ID up and running.
This is a seriously weird issue.
The resolution to this problem didn't come from the window at all. Prior to the window's show method being called there was another window that was opened as a dialog. In this dialog there was the following resource
<Window.Resources>
<DropShadowBitmapEffect x:Key="DropShadowEffect" Noise="0" Opacity="0.45" ShadowDepth="5" Softness="0.25"/>
</Window.Resources>
It was was being referenced by two textblocks in the same window as a "DynamicResource". After turning off the dialog and making the application start with the windows that was having the problem it was discovered that the issue was being caused by the dialog window. While I was researching the issue a coworker suggest that I turn the DynamicResource into a StaticResource because there was no reason for it to be dynamic.
This change in a dialog window using an resource that was only available within the scope of the dialog window fixed the binding issue described above in the "Main Window". I guess stranger things can happen.
The correct way to debug this is to take the working project and to alternately (modify it to match broken code/confirm it works) until it is either identical to the broken project or it breaks. The point at which it breaks tells you where the problem is. Modifying the broken project is typically a lost cause.
As a secondary point, I'd recommend adding the System.Diagnostics namespace to your XAML. It will make errors show up in the Visual Studio Output window.
xmlns:debug="clr-namespace:System.Diagnostics;assembly=WindowsBase"
As a possibly related point (in that it's not really clear what the problem in the broken project is), you might have a look at this StackOverflow question ("Combobox controling Tabcontrol") that relates to:
WPF,
ComboBoxes,
TabControls, and
binding between them using SelectedIndex.
There isn't yet a solution to this question, but it is a simpler problem.
Lastly, Josh Smith's MSDN code is pretty large. It's hard to figure out what you changed to add your ComboBox without seeing all the code.