|
This is a school assignment I have, just so you know.
A quick overview of my assignment is, that I create a UML class diagram for a game, and from those classes create a class library in C#.
That class library has to be imported into a WPF project where I use those classes and create a functioning game.
The point of the assignment is for the students to practice object oriented programming, so everything has to be in classes that we create ourselves.
The problem is, I'm am not too well-versed in WPF. I know that if I doubleclick on a button-control, code will automatically be generated where I can manipulate with different controls and data etc, but I don't know how a method in an instantiated object (or a static one) from a class library can get called when I click on a button-control, and then use that method to change text content in fx. a label.
I was thinking of creating a "UIManager" class that updates the WPF controls depending on the game state, but I have no idea how to create methods that will take WPF controls as parameters, in a class that is in a class library. For some reason I can't use the "using" statement to use the WPF specific namespaces in my class library project, but I don't even know if that is the solution to my problem.
I emphasize the class library because it is a requirement that it is done that way.
Any help, hint or guidance is very much appreciated.
|
|
|
|
|
If you want to create a WPF class library that can also include WPF "windows" XAML and code-behind, then just add references to the dll's that are normally "missing" versus a straight WPF "exe" (like Framework.dll, etc.)
Same goes for the "user controls" included in said class library.
I don't think you're being asked to actually "manipulate" the XAML.
Study one of the WPF Toolkits: that illustrates the type of architecture you're going after.
It was only in wine that he laid down no limit for himself, but he did not allow himself to be confused by it.
― Confucian Analects: Rules of Confucius about his food
|
|
|
|
|
Thanks for the fast reply!
I think I know what you mean, so I'll try to figure it out.
|
|
|
|
|
i copied 5 dlls into the folder specified in the ModulePath use the code in Bootstrapper:
protected override IModuleCatalog CreateModuleCatalog()
{
DirectoryModuleCatalog catelog = new DirectoryModuleCatalog();
catelog.ModulePath = @".\Modules";
return catelog;
} .
but after the application started ,only 4 of the modules were loaded.
but if i use
protected override void ConfigureModuleCatalog()
{
base.ConfigureModuleCatalog();
ModuleCatalog moduleCatalog = (ModuleCatalog)this.ModuleCatalog;
moduleCatalog.AddModule(typeof(moduleA));
moduleCatalog.AddModule(typeof(moduleB));
moduleCatalog.AddModule(typeof(moduleC));
moduleCatalog.AddModule(typeof(moduleD));
moduleCatalog.AddModule(typeof(moduleE));
}
all the modules will be loaded properly.
Who can tell me what's wrong with my code ?Thanks in advance.
|
|
|
|
|
I created a copy of my App.Config called "Release.Config". When I do a Release build, the following Post Build code is run:
if "Debug"=="$(ConfigurationName)" goto :nocopy
del "$(TargetPath).config"
copy "$(ProjectDir)\Release.config" "$(TargetPath).config"
:nocopy
This renames the file "Release.Config" to the output folder as "App.Config".
The problem is that the Visual Studio installer seems to be taking the Debug App.Config, not the Release version. Doesn't the installer project use the release code?
Anyone have any ideas on this?
If it's not broken, fix it until it is.
Everything makes sense in someone's mind.
Ya can't fix stupid.
|
|
|
|
|
Kevin Marois wrote: Visual Studio installer Are you actually using VS Installer to deploy your application?
I would think the Configuration Manager would be the appropriate tool to deploy an application (never used VS Installer).
Never underestimate the power of human stupidity -
RAH
I'm old. I know stuff - JSOP
|
|
|
|
|
Mycroft Holmes wrote: Are you actually using VS Installer to deploy your application?
Yes
Mycroft Holmes wrote: I would think the Configuration Manager would be the appropriate tool to deploy an application (never used VS Installer).
How would that hepl? The problem isn't the configurataion. When I do a release build, the correct app.config is in Bin\Release. The proble is that the installer isn't getting the right App.Config. it's somehow getting the app.config from bin\debug.
If it's not broken, fix it until it is.
Everything makes sense in someone's mind.
Ya can't fix stupid.
|
|
|
|
|
You could try using a configuration transform instead. Unfortunately, Visual Studio only supports them in web projects, but there's an add-in which adds support for other projects:
Configuration Transform - Visual Studio Marketplace[^]
"These people looked deep within my soul and assigned me a number based on the order in which I joined."
- Homer
|
|
|
|
|
Great I'll take a look. Thanks
If it's not broken, fix it until it is.
Everything makes sense in someone's mind.
Ya can't fix stupid.
|
|
|
|
|
That was what I was talking about, they are supported for WPF projects as well.
It is called Configuration Manager, you automatically get the debug config and need to set up a release config. The release config holds only the section that apply to the release with a replace directive and the deployment operation replaces the relevant sections and creates a config file.
Never underestimate the power of human stupidity -
RAH
I'm old. I know stuff - JSOP
|
|
|
|
|
I'm trying to get the AForge VideoSourcePlayer to work in a WPF app. It's a WinForms control hosted in a WindowsFormsHost. I can't get this to work ina WinForms app either, but I'm targeting WPF in the end.
XAML
<Grid>
<pre>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<Button Grid.Row="0"
Grid.Column="0"
x:Name="connectBt"
Height="32"
Width="100"
Margin="10,0,2,0"
Click="ConnectBt_Click"
Content="Connect"/>
<Button Grid.Row="0"
Grid.Column="1"
x:Name="disconnectBt"
Height="32"
Width="100"
Margin="2,10,10,10"
Click="DisconnectBt_Click"
Content="Disconnect"/>
<wfi:WindowsFormsHost Grid.Row="1"
Grid.Column="0"
Grid.ColumnSpan="2">
<aforge:VideoSourcePlayer x:Name="videoSourcePlayer"
Dock="Fill"/>
</wfi:WindowsFormsHost>
Code Behind
public partial class MainWindow : Window
{
#region CTOR
public MainWindow()
{
InitializeComponent();
this.DataContext = this;
videoSourcePlayer.NewFrame += VideoSourcePlayer_NewFrame;
videoSourcePlayer.Height = 320;
videoSourcePlayer.Width = 320;
}
#endregion
#region Private Methods
private void Connect()
{
FilterInfoCollection videoDevices = new FilterInfoCollection(FilterCategory.VideoInputDevice);
if (videoDevices.Count == 0)
{
throw new ApplicationException();
}
var selectdDevice = videoDevices[0].MonikerString;
VideoCaptureDevice videoSource = new VideoCaptureDevice(selectdDevice);
OpenVideoSource(videoSource);
}
private void Disconnect()
{
if (videoSourcePlayer.VideoSource != null)
{
videoSourcePlayer.SignalToStop();
videoSourcePlayer.WaitForStop();
}
}
private void HandleNewFrame(ref Bitmap image)
{
}
private void OpenVideoSource(IVideoSource source)
{
videoSourcePlayer.SignalToStop();
videoSourcePlayer.WaitForStop();
videoSourcePlayer.VideoSource = source;
videoSourcePlayer.Start();
}
#endregion
#region Event Handlers
private void Window_Unloaded(object sender, RoutedEventArgs e)
{
Disconnect();
}
private void ConnectBt_Click(object sender, RoutedEventArgs e)
{
Connect();
}
private void DisconnectBt_Click(object sender, RoutedEventArgs e)
{
Disconnect();
}
private void VideoSourcePlayer_NewFrame(object sender, ref Bitmap image)
{
HandleNewFrame(ref image);
}
#endregion
}
When I run this, the VideoSourcePlayer displays "Connecting..." but i never does. The camera moniker string is "@device:pnp:\\?\usb#vid_046d&pid_082d&mi_00#6&39ab8351&0&0000#{65e8773d-8f56-11d0-a3b9-00a0c9223196}\global". it's a Logitech USB camera.
Anyone have any experience with this?
If it's not broken, fix it until it is.
Everything makes sense in someone's mind.
Ya can't fix stupid.
|
|
|
|
|
Adding background as Transparent for WindowsFormsHost worked for me.
<wfi:windowsformshost x:name="VideoSourceWindowsFormsHost" width="100" height="50" grid.row="2" grid.column="1"
="" background="Transparent">
<controls:videosourceplayer x:name="videoSourcePlayer" width="250" height="250">
|
|
|
|
|
I copied the TextBox template from here into my resources. I just want to study it and see how things work, and the TextBox seems simple enough.
I created a a CustomControl of type TextBox called TextBoxEx. I pasted the style into the Generic.xml in the Themes folder, and it doesn't work.
With this code line of in the CTOR, the Border doesn't show up.
public class TextBoxEx : TextBox
{
static TextBoxEx()
{
DefaultStyleKeyProperty.OverrideMetadata(typeof(TextBoxEx), new FrameworkPropertyMetadata(typeof(TextBoxEx)));
}
}
If I comment the line out, the border appears.
if go into the style and change
<Border.BorderBrush>
<SolidColorBrush Color="{DynamicResource BorderMediumColor}" />
</Border.BorderBrush>
to a StaticResource
<Border.BorderBrush>
<SolidColorBrush Color="{StaticResource BorderMediumColor}" />
</Border.BorderBrush>
Then it works ok.
What's going on here?
If it's not broken, fix it until it is.
Everything makes sense in someone's mind.
Ya can't fix stupid.
|
|
|
|
|
I have this DataGrid with three columns:
<DataGrid>
<DataGrid.Columns>
<DataGridTextColumn Header="Col1" Width="100" />
<DataGridTextColumn Header="Col2" Width="Auto" />
<DataGridTextColumn Header="Col3" Width="100" />
</DataGrid.Columns>
</DataGrid> I would like 'Col3' to always be at the right side of the DataGris regardless how wide the DataGrid is.
Since 'Col1' and 'Col3' has fixed widths, 'Col2' is free to dynamically change width.
Is this possible to "Dock" 'Col3' to the right side of the DataGrid?
I'm looking for a solution simular to a DockPanel:
<DataGrid LastChildFill="true">
<Label Content="Col1" DockPanel.Dock="Left" />
<Label Content="Col3" DockPanel.Dock="Right" />
<Label Content="Col2" />
</DockPanel>
|
|
|
|
|
You mean "visible"? If you define it "on the right", it stays there. If the preceding columns are "too wide", you have to add scroll bars.
It was only in wine that he laid down no limit for himself, but he did not allow himself to be confused by it.
― Confucian Analects: Rules of Confucius about his food
|
|
|
|
|
You can "freeze" one of more columns, but only on the left-hand side:
DataGrid.FrozenColumnCount Property (System.Windows.Controls) | Microsoft Docs[^]
You might be able to make it appear on the right-hand side with a custom template, but it would probably require a lot of work.
If you just want column 2 to fill the remaining space, set its width to * :
<DataGridTextColumn Header="Col2" Width="*" />
"These people looked deep within my soul and assigned me a number based on the order in which I joined."
- Homer
|
|
|
|
|
Hum... too bad...
Thanks for the reply anyway!
|
|
|
|
|
I want to create a datagrid with dynamic row and column.
I know how create a datagrid and bind the Itemsource.
How define the dynamic column ?
Perhaps you have a short example.
<DataGrid
x:Name="ListViewFiles"
MaxWidth="2560"
MaxHeight="1600"
AutoGenerateColumns="False"
CanUserAddRows="False"
CanUserSortColumns="True"
CellStyle="{StaticResource Content_DataGrid_Centering}"
DockPanel.Dock="Top"
EnableColumnVirtualization="True"
EnableRowVirtualization="True"
ItemsSource="{Binding Path=CloudInterface.ListViewFile}"
PreviewMouseLeftButtonDown="Drag_PreviewMouseLeftButtonDown"
PreviewMouseMove="ListViewFiles_PreviewMouseMove"
RowHeaderWidth="0"
ScrollViewer.CanContentScroll="True"
ScrollViewer.HorizontalScrollBarVisibility="Auto"
ScrollViewer.VerticalScrollBarVisibility="Auto"
SelectionMode="Single">
<DataGrid.Columns>
<DataGridTextColumn Binding="{Binding ConfigItem.MostRecentConfigFile.Product}">
<DataGridTextColumn.HeaderTemplate>
<DataTemplate>
<DockPanel>
<Label Content="{Binding Lab_Product, Source={StaticResource Resources}}" />
</DockPanel>
</DataTemplate>
</DataGridTextColumn.HeaderTemplate>
<DataGridTextColumn.ElementStyle>
<Style TargetType="{x:Type TextBlock}">
<Setter Property="Margin" Value="5" />
<Setter Property="Padding" Value="5" />
</Style>
</DataGridTextColumn.ElementStyle>
</DataGridTextColumn>
<DataGridTextColumn Binding="{Binding ConfigItem.MostRecentConfigFile.ArchitectureSoftwareVersion}">
<DataGridTextColumn.HeaderTemplate>
<DataTemplate>
<DockPanel>
<Label Content="{Binding Lab_Version, Source={StaticResource Resources}}" />
</DockPanel>
</DataTemplate>
</DataGridTextColumn.HeaderTemplate>
<DataGridTextColumn.ElementStyle>
<Style TargetType="{x:Type TextBlock}">
<Setter Property="Margin" Value="5" />
<Setter Property="Padding" Value="5" />
</Style>
</DataGridTextColumn.ElementStyle>
</DataGridTextColumn>
</DataGrid.Columns>
</DataGrid>
|
|
|
|
|
|
|
I have set up the calculation program for the program, but now the problem is that I want to integrate the two classes together but it still is not compatible so you can help me! Textblock caculator not show Only one class can be implemented! code see here :
https:
https:
sql data :
https://i.stack.imgur.com/pCgiK.png[^]
|
|
|
|
|
Please post proper details of your problem. People here cannot guess what your code is doing.
|
|
|
|
|
Edit your question and post just the relevant code. Don't expect people to follow links to who knows what.
Social Media - A platform that makes it easier for the crazies to find each other.
Everyone is born right handed. Only the strongest overcome it.
Fight for left-handed rights and hand equality.
|
|
|
|
|
I have added a Routed Event to a user control:
public static readonly RoutedEvent ItemChangedEvent =
EventManager.RegisterRoutedEvent("ItemChanged",
RoutingStrategy.Bubble,
typeof(RoutedEventHandler),
typeof(DropDownEntryView));
public event RoutedEventHandler ItemChanged
{
add { AddHandler(ItemChangedEvent, value); }
remove { RemoveHandler(ItemChangedEvent, value); }
}
private void RaiseItemChangedEvent(string newValue, string oldValue)
{
var args = new ItemChangedEventArgs(ItemChangedEvent, newValue, oldValue);
RaiseEvent(args);
}
Here is the ItemChangedEventArgs class:
public class ItemChangedEventArgs : RoutedEventArgs
{
public string NewValue { get; private set; }
public string OldValue { get; private set; }
public ItemChangedEventArgs(RoutedEvent routedEvent, string newValue, string oldValue)
: base(routedEvent)
{
NewValue = newValue;
OldValue = OldValue;
}
}
The XAML
<ctrls:DropDownEntryView Grid.Column="0"
Items="{Binding DataContext.EmailItems,
ElementName=clientsView,
Mode=TwoWay,
UpdateSourceTrigger=PropertyChanged}"
EditBarCaption="Edit Emails..."
ShowEditBar="True"
ItemCategoryKey="email_types"
HorizontalAlignment="Left"
Width="400"
Margin="5">
<pre>
<i:Interaction.Triggers>
<i:EventTrigger EventName="ItemChanged">
<i:InvokeCommandAction Command="{Binding ElementName=clientsView, Path=DataContext.EmailItemChangedCommand}"
CommandParameter="{Binding}"/>
</i:EventTrigger>
</i:Interaction.Triggers>
How do I pass the ItemChangedEventArgs in the XAML?
If it's not broken, fix it until it is.
Everything makes sense in someone's mind.
Ya can't fix stupid.
|
|
|
|
|
I would load a list of user controls and use Property Changed instead. Less code.
It was only in wine that he laid down no limit for himself, but he did not allow himself to be confused by it.
― Confucian Analects: Rules of Confucius about his food
|
|
|
|