|
I have N numbers of object floating inside of WPF window. I can rotate any object through by selecting with combo box and then by pressing a button. It works fine, but it is not maintaining its position. When second time I want to rotate it does not move, which implies that after rotating it did not keep the latest position.
For just debug purpose I change the angle, but still it rotated from its starting position, but not from last position.
How we can animate (from angle 0 to 90)? Do I need to write storyboard for each object in XAML? Looks odd! Or is there way to write dynamically storyboard.
Your prompt answer will be very much appreciated.
Agha.khan@hotmail.com
|
|
|
|
|
The problem might be the following:
after assigning an animation to a element the animation will run to it's endpoint and stay there!
So if you try to change the propertie (say angle) itself it won't have any effect to the element cause the animation is still in place and has precedence.
So either you remove the animation (just assign a null animation) or you plug another animation on top (I advise removing animations after they run through - just don't forget to save/reset the changed values)
|
|
|
|
|
This part I am missing. How can we save the values? Is there any API for saving values? Thanks for reply.
Best regards
Agha Khan
|
|
|
|
|
If you are using a storyboard instead of BeginAnimation directly you can handle a event - telling you when the stroyboard finishs - there you just save the old value in a local variable, set the storyboard/animations of the element to null and reassign the value to the property - that's it.
This works because:
- the properties are reflecting the values assinged by the storyboards progress but you can't set them because the storyboard will override them
- by setting a null storyboard to a element you will erase all existing storyboards
- after this you can use the properties just like you used to
Here is an example using AxisAngleRotations, this code runs in a Completed-event of a storyboard rotating some WPF-3D elements:
<br />
int iSign = Math.Sign((I.currRotation.Rotation as AxisAngleRotation3D).Angle);<br />
var dAngle = Math.Ceiling(Math.Abs((I.currRotation.Rotation as <br />
AxisAngleRotation3D).Angle / 90.0)) * 90.0 * iSign;<br />
<br />
I.currRotation.Rotation.BeginAnimation(AxisAngleRotation3D.AngleProperty, null);<br />
<br />
if ((I.currRotation.Rotation as AxisAngleRotation3D).Angle != dAngle)<br />
(I.currRotation.Rotation as AxisAngleRotation3D).Angle = dAngle;<br />
(you might wonder why I use the ugly "/ 90 ) * 90" ... construct! - Well this code is for a "rubiks cube" and there I only want the finished rotations to be multiples of 90°. But if you use many rotations you might end up at 89.8 or something and this just looks weired)
|
|
|
|
|
Hi guys,
Can someone translate this vb code to C# please???
intCount = objItems.Count
For i = intCount to 1 Step -1
objItem = objItems(i)
objItem.Delete
|
|
|
|
|
Maybe...
int count = objItems.Count;
for (int i = count; i>=1; i--){
objItem = objItems[i];
objItem.Delete();
}
Download reflector, it'll make translation alot easier.
Mark.
modified on Thursday, January 31, 2008 6:58:24 PM
|
|
|
|
|
It translates to:
intCount = objItems.Count;
for (i = intCount; i >= 1; i--) {
objItem = objItems[i];
objItem.Delete();
The Next that is missing from the code translates into the closing }.
The C# code will cause an IndexOutOfRangeException exception, just as the VB code does.
Experience is the sum of all the mistakes you have done.
|
|
|
|
|
As Guffa says, it'll generate an IndexOutOfRangeException
First lesson of .net programming, arrays are zero based so you get objItems[0] up to objItems[objItems.Count-1], so you'll need to alter the for loop to something like...
for (int i = intCount-1; i>=0; i--)
{
...
}
Also, if intCount isn't declared somewhere else you're gonna have a problem so maybe
int intCount = objItems.Count;
|
|
|
|
|
I thought VB arrays were indexed from 1....
Cheers,
Vikram.
"I will put my new found knolage to good use" - Captain See Sharp.
"Every time Lotus Notes starts up, somewhere a puppy, a kitten, a lamb, and a baby seal are killed." - Gary Wheeler.
|
|
|
|
|
Are they? Haven't used VB for so long I can't remember! Even so, in C# they're zero based.
|
|
|
|
|
DaveyM69 wrote: Are they?
Of course not.
Experience is the sum of all the mistakes you have done.
|
|
|
|
|
Vikram A Punathambekar wrote: I thought VB arrays were indexed from 1...
The base is zero. In VB6 that was the default, but you could use OPTION BASE 1 to change it to one.
Then I guess that you have also always declared your arrays with one unused item...
Dim arr(100) As Integer
will create an array with 101 items, not 100 items.
Experience is the sum of all the mistakes you have done.
|
|
|
|
|
Guffa wrote: In VB6 that was the default, but you could use OPTION BASE 1 to change it to one.
I'm so glad I don't know VB.
Cheers,
Vikram.
"I will put my new found knolage to good use" - Captain See Sharp.
"Every time Lotus Notes starts up, somewhere a puppy, a kitten, a lamb, and a baby seal are killed." - Gary Wheeler.
|
|
|
|
|
Vikram A Punathambekar wrote: I'm so glad I don't know VB.
I can't even spell VB.
|
|
|
|
|
jester dey i coldnt even spel vishil besik, and to dey im a progremer.
Experience is the sum of all the mistakes you have done.
|
|
|
|
|
Pete O'Hanlon wrote: VB
Wash your keyboard!
[ My Blog] "Visual studio desperately needs some performance improvements. It is sometimes almost as slow as eclipse." - Rüdiger Klaehn "Real men use mspaint for writing code and notepad for designing graphics." - Anna-Jayne Metcalfe
|
|
|
|
|
Vikram A Punathambekar wrote: I'm so glad I don't know VB.
You have no idea.
Experience is the sum of all the mistakes you have done.
|
|
|
|
|
Hi,
I am trying to get my first generic method work. Here is what I want to do:
Based on diffent type of users, we need to use different DLL. The DLL is COM object wrapper, which expose a function that can be called. The original code looks like the following:
using System.Runtime.InteropServices;
using AsynchWrapper1;
using AsynchWrapper2;
using AsynchWrapper3;
....
namespace MyNameSpace
{
public class Unility
{
public static void CallAsynchWrapper(int clientType, int clientId)
{
if (clientType ==0)
{
clsAsynchWrapper1 asynchWrapper = new clsAsynchWrapper1();
asynchWrapper.XYZ(clientId);
Marshal.ReleaseComObject(asynchWrapper);
asynchWrapper = null;
}
else if (clientType ==1)
{
clsAsynchWrapper2 asynchWrapper = new clsAsynchWrapper2();
asynchWrapper.XYZ(clientId);
Marshal.ReleaseComObject(asynchWrapper);
asynchWrapper = null;
}
else
{
clsAsynchWrapper3 asynchWrapper = new clsAsynchWrapper3();
asynchWrapper.XYZ(clientId);
Marshal.ReleaseComObject(asynchWrapper);
asynchWrapper = null;
}
}
}
Where XYZ is the function that all 3 DLLs expose.
I want to make a generic method by modifying the CallAsynchWrapper function doing the following:
public static void CallAsynchWrapper(int clientType, int clientId)
{
if (clientType ==0)
{
clsAsynchWrapper1 asynchWrapper = new clsAsynchWrapper1();
genericCallAsynchWrapper<clsasynchwrapper1>(asynchWrapper, clientId);
}
else if (clientType ==1)
{
clsAsynchWrapper2 asynchWrapper = new clsAsynchWrapper2();
genericCallAsynchWrapper<clsasynchwrapper2>(asynchWrapper, clientId);
}
else
{
clsAsynchWrapper3 asynchWrapper = new clsAsynchWrapper3();
genericCallAsynchWrapper<clsasynchwrapper3>(asynchWrapper, clientId);
}
}
and add a generic method:
static void genericCallAsynchWrapper<t>(T asynchWrapper, int clientId)
{
asynchWrapper.XYZ(clientId);
Marshal.ReleaseComObject(asynchWrapper);
asynchWrapper = default(T);
}
When I compile it, I got error message” T doesn’t have a definition of XYZ.”
My first question is: Is that possible to make a generic method for what I am trying to do?
If that’s possible, how can I make compiler knows that T does have XYZ?
Does anybody know the answer?
Thanks in advance for any help!
|
|
|
|
|
You need to add a constraint to your generic function to specify that the generic type you pass in will have a XYZ method. The best way to do that is to make all your clsAsynchWrapper1, 2 and 3 implement a common interface, with that interface having the XYZ function.
interface IClsAsynchWrapper
{
void XYZ(int clientId);
}
class clsAsyncWrapper1 : IClsAsynchWrapper
{...}
static void genericCallAsynchWrapper<T>(T asynchWrapper, int clientId) where T: IClsAsyncWrapper
{
asynchWrapper.XYZ(clientId);
}
That said, I think polymorphism (through inheritance) would serve you better here than generics. How about having a base class, say ClsAsynchWrapper and have all the ClsAsyncWrapperX classes derive from it? You could then move the code in your generic method to the base class.
|
|
|
|
|
Thank you so much!
That's exactly what I need. I mean both interface and polymorphism. Thank you for enlightening me! I will try both ways and let you know how it goes.
Thanks again!
|
|
|
|
|
I sort the datatable and hence store it in dataview. I use dataView.Sort.
GridView.DataSource = SortedDataView;
GridView.DataBind();
I get the sorted grid now. When I click edit, the sort goes off.
So I try to store it in a cache
Cache["AdminGrid"] = SortedDataView;
Iam unable to retrieve it into a datatable again.
DataTable dtData = (DataTable)Cache["AdminGrid"]; results in an error saying DataView cannot be converted into DataTable.
Any help is appreciated.
Thanks
|
|
|
|
|
DataViews have a Table property to return the DataTable that is associated with it. So you would get reference to the DataTable like...
<br />
DataTable dtData = ((DataView) Cache["AdminGrid"]).Table;<br />
|
|
|
|
|
This is a wierd one.
If you set a combo box's AutoCompleteMode to anything but None, the first time (but only the first time) the control loses focus its TextChanged event is fired if the text hasn't changed!
Is there a workaround or solution for this?
(I'm using VS2008/.NET 3.5 by the way)
Edit: I've submitted a bug report to M$
Edit 2: It was pretty easy to sort a work around[^] for this which I've attached to the bug report. Apparently this has existed since VS2005/.NET 2.0 at least!
modified on Saturday, February 02, 2008 5:28:06 AM
|
|
|
|
|
Here is my scenario,
Events are occuring as follows
.....START---info--info---info---END.....START---info--info---info---END.....START---info--info---info---END and so on
Files are written out based on, end event occurance or 10 mins time out which ever occurs first
i.e
information gathered from start till end must be written in one file
or
If 10 mins elasped and end event was not recieved then write what info we have gathered and again wiat for another 10 mins expecting an end event....say again our 10 mins elasped and nothing happened we write down wht we haev and wait again...say now we got an end event so in this case we will have 3 files.... as
File 1: START---info--info
File 2: info--info--info
File 3: info---END
What I have done is as soon as start event is received I start a thread which waits for 10 mins and writes out files. This is a continuous loop. The only way to come out of this loop is by interrupting the thread (this happens when we get an end event). When a thread is interrupted it will write what ever it has gathered and end.
Is this a right approach?
any other ideas to do it?
Thanks!
|
|
|
|
|
Hi,
from what you told us I think:
1. yes, your scheme could work
2. but you really need only one thread for all the starts and ends,
just have it sit and wait for a start, do its job until an end is received, then
repeat everything in a big while(true) loop. The 10 minute periods can be obtained
from a timer or, depending on your data source, a read with timeout and DateTime.Now
observations.
If you want the app to maintain a normal GUI, everything else should be handled by
a background thread; if not, you can do it all in the main thread (not recommended).
Luc Pattyn [Forum Guidelines] [My Articles]
This month's tips:
- before you ask a question here, search CodeProject, then Google;
- the quality and detail of your question reflects on the effectiveness of the help you are likely to get;
- use PRE tags to preserve formatting when showing multi-line code snippets.
|
|
|
|