|
In MSDN there is a demo about styling scrollviewer.
<ControlTemplate x:Key="VerticalScrollBar" TargetType="{x:Type ScrollBar}">
<Grid >
<Grid.RowDefinitions>
<RowDefinition MaxHeight="18"/>
<RowDefinition Height="0.00001*"/>
<RowDefinition MaxHeight="18"/>
</Grid.RowDefinitions>
<Border
Grid.RowSpan="3"
CornerRadius="2"
Background="#F0F0F0" />
<RepeatButton
Grid.Row="0"
Style="{StaticResource ScrollBarLineButton}"
Height="18"
Command="ScrollBar.LineUpCommand"
Content="M 0 4 L 8 4 L 4 0 Z" />
<Track
Name="PART_Track"
Grid.Row="1"
IsDirectionReversed="true">
<Track.DecreaseRepeatButton>
<RepeatButton
Style="{StaticResource ScrollBarPageButton}"
Command="ScrollBar.PageUpCommand" />
</Track.DecreaseRepeatButton>
<Track.Thumb>
<Thumb
Style="{StaticResource ScrollBarThumb}"
Margin="1,0,1,0"
Background="{StaticResource HorizontalNormalBrush}"
BorderBrush="{StaticResource HorizontalNormalBorderBrush}" />
</Track.Thumb>
<Track.IncreaseRepeatButton>
<RepeatButton
Style="{StaticResource ScrollBarPageButton}"
Command="ScrollBar.PageDownCommand" />
</Track.IncreaseRepeatButton>
</Track>
<RepeatButton
Grid.Row="3"
Style="{StaticResource ScrollBarLineButton}"
Height="18"
Command="ScrollBar.LineDownCommand"
Content="M 0 0 L 4 4 L 8 0 Z"/>
</Grid>
</ControlTemplate>
The code set the second row to 0.000001* and the other tow rows as 18px. Why could not I set the second row to *?
|
|
|
|
|
mildred-frontfree wrote: Why could not I set the second row to *?
You probably could....have you tried it?
Mark Salsbery
Microsoft MVP - Visual C++
|
|
|
|
|
Yes, I have tried on two computers both with XP operating system. But one of them works well, and the other one didn't work. If I set it to * at the other computer, the Thumb disappear and both the top repeatButton and the down repeatButton huddle together.Really weird!
|
|
|
|
|
I suppose that's why they used the tiny amount then.
It really shouldn't be a concern unless the scrollbar is always going to be so small
there's no bar between the buttons, in which case you'd probably want to restyle the
control and just use a stack panel
Mark Salsbery
Microsoft MVP - Visual C++
|
|
|
|
|
Thanks a lot! It may caused by some damn difference of my two computers. Anyway,WPF is really simply and flexible. But in some case, it is too simply to deeply learn the mechanism.
|
|
|
|
|
|
|
|
You haven't shown any XAML showing the elements that make up your custom button
or the classes involved, so it's hard to guess.
If your custom button class is not derived from ButtonBase, then there's not going to
be any built-in Click event. The Click event is created based on lower level mouse
and keyboard events.
If your button class IS derived from ButtonBase or Button, then the default implementation
is probably consuming the events to convert them to Click events.
Mark
Mark Salsbery
Microsoft MVP - Visual C++
|
|
|
|
|
|
Blend's "Make Button...." converts the element to a Button class...
I'm not sure why I had to look that up myself.
So in that button class you can add an event handler for any events
the button class provides.
Which event do you need a handler for?
For example, the Click event:
<Button Style="{DynamicResource ButtonStyle1}" Width="100" Height="25" Content="Button" Click="Button_Click"/>
...
private void Button_Click(object sender, RoutedEventArgs e)
{
}
There's some checkboxes below the Code Project message editor window that will
control how the < and > are handled when you paste XAML...
Mark Salsbery
Microsoft MVP - Visual C++
|
|
|
|
|
|
Collin Jasnoch wrote: I would want to make a click event in the usercontrol that instantiates the custom control
Only buttons have Click events, so instead you could use a lower level mouse event
like MouseLeftButtonDown.
I'm still not sure where you're having the trouble - adding an event handler?
Instantiating a control from code?
Mark Salsbery
Microsoft MVP - Visual C++
|
|
|
|
|
|
You must not be putting the code-behind in the right class,
or not putting the right class and/or namespace in the XAML.
Your namespaces and class names certainly don't match up in the XAML you posted.
Look closely at your code for the following highlighted (red) items:
<!-- UserControl1.xaml -->
<UserControl x:Class="<code>MyNamespace.UserControl1</code>"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:MyControlsWPF="clr-namespace:<code>MyControlsWPF</code>"
Width="100" Height="100" >
<Grid>
<code><!-- Here's your instantiation of a custom button! --></code>
<MyControlsWPF:MyButton x:Name="myCustomButton" Click="myCustomButton_Click" />
</Grid>
</UserControl>
using System;
using System.Windows;
using System.Windows.Controls;
namespace <code>MyNamespace</code>
{
public partial class <code>UserControl1</code> : UserControl
{
public UserControl1()
{
InitializeComponent();
}
private void myCustomButton_Click(object sender, RoutedEventArgs e)
{
}
}
}
Mark Salsbery
Microsoft MVP - Visual C++
|
|
|
|
|
|
Collin Jasnoch wrote: the namespace would get included anyways (wouldn't it?)...
You'll need to actually look at the xaml and code-behind to determine that.
Collin Jasnoch wrote: I just don't see how to trigger off a click.
What does that mean? You want to simulate a click? Use an event trigger
to do something in response to the Click event? Respond to a click event
in code-behind?
Collin Jasnoch wrote: I had posted the actual one earlier but it was REALLY long
So forget all the fancy stuff you did with your button...
Make a canvas: <Canvas Width="100" Height=20 Background="LightSteelBlue" />
Use Blend's "Make Button..." to make a button from that canvas.
Use that button in another user control like you want to, including showing WHERE
you want a click event handled.
Now post the actual xaml and code (which will be very small) so we don't have to guess what
you're trying to do
Mark Salsbery
Microsoft MVP - Visual C++
|
|
|
|
|
|
Collin Jasnoch wrote: I thought that is what I had posted...
Maybe....that doesn't mean I understood it
Anyway this is excellent, thanks. Now I see what's going on.
First of all, since your custom button is wrapped in a UserControl, its
events are no longer available at the UserControl level, so that's why
you can't get a Click event from the UserControl. This is one of the reasons
why a UserControl is the least flexible way to make a custom control....
UserControl is best suited for entirely self-contained controls.
There's a variety of ways around this - here's a few...
1) instead of wrapping a custom button in a UserControl
and instantiating a control of that UserControl type, just cut/copy the
button style that Blend created ("ButtonStyle1") to an appropriate place in
your app's resources, and anywhere you want an instance of your custom button,
instantiate a regular Button using that style, e.g.:
2) Leave it the way it is and add a public Click event to the CustomButton class.
This event should have the same signature as the ButtonBase class' Click event.
Add a Click event handler to the button in in the CustomButton user control.
In that handler, which will be in the CustomButton class, fire the event you added
to the CustomButton class....you'd be effectively just forwarding the event.
3) Go the full custom control route: Control Authoring Overview[^]
Method 3 is rarely necessary.
Method 2 has the limitations of a UserControl (e.g. users of the control can't
re-template the control to customize it) but it's the simplest to code.
Method 1 is also simple, and a very common way of customizing controls.
More info on options for customizing controls here: Control Authoring Overview[^]
Mark Salsbery
Microsoft MVP - Visual C++
|
|
|
|
|
I have an ObservableCollection bound to a list box - the collection is essentially ObservableCollection<person> where Person has 2 properties: Name and Age. How do I bind the currently selected item in the listbox to some textboxes (seperate from the ListBox) which show the Name and Age of the Person and allow the Name and Age to be updated using the TextBoxes?
|
|
|
|
|
The easy way to do this is to set IsSynchronizedWithCurrentItem="True" on your listview. This way, the currently selected item is synchronised with the collection.
"WPF has many lovers. It's a veritable porn star!" - Josh Smith As Braveheart once said, "You can take our freedom but you'll never take our Hobnobs!" - Martin Hughes.
My blog | My articles | MoXAML PowerToys | Onyx
|
|
|
|
|
|
Thanks for that, but I already know what to do. I assume you meant to link this to the OP rather than me.
"WPF has many lovers. It's a veritable porn star!" - Josh Smith As Braveheart once said, "You can take our freedom but you'll never take our Hobnobs!" - Martin Hughes.
My blog | My articles | MoXAML PowerToys | Onyx
|
|
|
|
|
Sorry, thought it backed up your comment of using IsSynchronizedWithCurrentItem="True"
|
|
|
|
|
I saw it - thanks.
modified on Monday, May 11, 2009 12:48 PM
|
|
|
|